У PHP 8.5 підтримуватиметься рекурсія у Closure за допомогою отримання інформації про поточний виконувач Closure (подяка Александру Добуа). Як зазначено в RFC:closure_self_reference, наразі обхідним варіантом є прив'язка змінної в Closure:
$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) . "\n";
З початку PHP 8.5 ви зможете використовувати метод getCurrent()
для отримання інформації про поточний виконувач Closure. Цей код пропонує інший підхід у порівнянні з оригінальним RFC, і автор назвав його "набагато простішою альтернативою":
$fibonacci = function (int $n) {
if (0 === $n || 1 === $n) {
return $n;
}
$fn = Closure::getCurrent();
return $fn($n - 1) + $fn($n - 2);
};
echo $fibonacci(10) . "\n";
Якщо вас цікавить реалізація, зверніть увагу на Pull Request #18167 у вихідному коді PHP (дивіться eb65ec4).