PHP 8.5:在闭包中获取当前闭包
PHP 8.5 将支持闭包中的递归,方法是获取当前正在执行的闭包(感谢 Alexandre Daubois 的贡献)。正如 rfc:closure_self_reference RFC 中指出的,目前的变通方法是将变量引用绑定到闭包中。PHP 8.5 提供了静态方法 Closure::getCurrent() 来获取当前正在运行的闭包:
$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() 方法来获取当前正在执行的闭包。这段代码采用了与上面提到的原始 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";如果你对实现方式感兴趣,请查看 PHP 源代码中的 Pull Request #18167(参见 eb65ec4)。