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";

©我爱水煮鱼,本站推荐使用的主机:阿里云,国外主机建议使用BlueHost

本站长期承接 WordPress 优化建站业务,请联系微信:「chenduopapa」。