Отримання поточного виконуваного замикання в PHP 8.1

Перекладено ШІ
Оригінал: Laravel News
Оновлено: 25 липня, 2025
PHP 8.5 готовий запропонувати нові можливості для роботи з рекурсією в замиканнях — тепер ви можете легко звертатися до виконуваного закриття. Дізнайтеся, як новий метод `getCurrent()` спрощує реалізацію рекурсивних функцій у нашій статті

У 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).