(PHP 8 >= 8.5.0)
Closure::getCurrent — Возвращает текущее выполняемое замыкание
Метод возвращает текущее выполняемое замыкание. Метод в первую очередь полезен
для рекурсивных замыканий без обязательного захвата ссылки на переменную
замыкания через ключевое слово use.
Метод доступен только внутри замыкания; вызов извне контекста замыкания сгенерирует ошибку.
Сигнатура функции не содержит параметров.
Метод возвращает текущий объект Closure.
При вызове извне контекста замыкания метод выбросит ошибку Error.
Пример #1 Пример получения замыкания методом Closure::getCurrent()
Следующая функция вычисляет n-е число Фибоначчи через рекурсивные вызовы замыкания, которое возвращается методом Closure::getCurrent():
<?php
$fibonacci = function (int $n) {
if (0 === $n || 1 === $n) {
return $n;
}
$fn = Closure::getCurrent();
return $fn($n - 1) + $fn($n - 2);
};
echo $fibonacci(10); // Выведет: 55Пример #2 Сравнение с традиционным подходом
До PHP 8.5 для реализации рекурсивных замыканий требовалось захватить ссылку
на переменную замыкания через ключевое слово use:
<?php
// Традиционный подход, который по-прежнему работает в 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); // Выведет: 55
Метод Closure::getCurrent() не требует
объявления переменной со ссылкой в предложении use,
делает код чище и снижает риск ошибок.