(PHP 8 >= 8.5.0)
Closure::getCurrent — Devuelve la closure actualmente en ejecución
Devuelve la closure actualmente en ejecución. Este método es principalmente útil
para implementar closures recursivas sin necesidad de capturar una referencia
a la variable de la closure usando la palabra clave use.
Este método debe ser llamado desde dentro de una closure; llamarlo fuera de un
contexto de closure resultará en Error: Current function is not a closure.
Esta función no contiene ningún parámetro.
Devuelve la instancia de Closure actualmente en ejecución.
Lanza un Error si se llama fuera de un contexto de closure.
Ejemplo #1 Ejemplo de Closure::getCurrent()
Uso de Closure::getCurrent() para implementar una función de Fibonacci recursiva:
<?php
$fibonacci = function (int $n) {
if ($n === 0 || $n === 1) {
return $n;
}
$fn = Closure::getCurrent();
return $fn($n - 1) + $fn($n - 2);
};
echo $fibonacci(10); // Muestra: 55
?>Ejemplo #2 Comparación con el enfoque tradicional
Antes de PHP 8.5, implementar closures recursivas requería capturar una referencia
a la variable de la closure usando la palabra clave use:
<?php
// Enfoque tradicional (aún funciona en PHP 8.5)
$fibonacci = function (int $n) use (&$fibonacci) {
if ($n === 0) return 0;
if ($n === 1) return 1;
return $fibonacci($n - 1) + $fibonacci($n - 2);
};
echo $fibonacci(10); // Muestra: 55
?>
El enfoque con Closure::getCurrent() elimina la necesidad de
declarar la variable con una referencia en la cláusula use,
lo que hace el código más limpio y menos propenso a errores.