(PHP 8 >= 8.5.0)
Closure::getCurrent — Retourne la closure en cours d'exécution
Retourne la closure en cours d'exécution. Cette méthode est principalement
utile pour implémenter des closures récursives sans avoir besoin de capturer
une référence vers la variable de la closure en utilisant le mot-clé
use.
Cette méthode doit être appelée depuis une closure ; l'appeler en dehors
d'un contexte de closure provoquera l'erreur Error: Current function is not a closure.
Cette fonction ne contient aucun paramètre.
Retourne l'instance de Closure en cours d'exécution.
Lance une Error si elle est appelée en dehors d'un contexte de closure.
Exemple #1 Exemple avec Closure::getCurrent()
Utilisation de Closure::getCurrent() pour implémenter une fonction de Fibonacci récursive :
<?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); // Affiche : 55
?>Exemple #2 Comparaison avec l'approche traditionnelle
Avant PHP 8.5, implémenter des closures récursives nécessitait de capturer
une référence vers la variable de la closure en utilisant le mot-clé
use :
<?php
// Approche traditionnelle (fonctionne toujours 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); // Affiche : 55
?>
L'approche avec Closure::getCurrent() élimine le besoin
de déclarer la variable avec une référence dans la clause use,
rendant le code plus propre et moins sujet aux erreurs.