编程

PHP 8.5:在闭包中获取当前闭包

9 2025-11-20 09:35:00

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)。