PHP 8.5 闭包支持直接递归调用,不再需要 use (&$closure)
在 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). "\n";
PHP 8.5 引入了 Closure::getCurrent() 方法,这个方法可以可以为闭包提供了自引用能力,允许闭包在执行过程中获取对自身的引用,从而使得递归调用变得非常简单和清晰,上面计算斐波那契数列的代码可以改成:
$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";