PHP –在匿名函数/闭包中进行递归

如果您尝试递归使用PHP匿名函数而遇到麻烦,则可能会看到类似以下的错误

Notice: Undefined variable: fooFunction in /yourScript.php on line 10

此错误可能是由[至少]两个问题之一引起的:

不使用功能变量

看一下脚本中抛出“未定义变量”错误的行。如果在那行进行递归调用,那么这就是您的问题。

您需要做的是在函数声明中使用use关键字,并提及函数变量本身。看一下#2和下面的示例,看看如何正确执行此操作。

无法通过引用传递函数变量

如果脚本中的“未定义变量”错误被抛出到函数声明行上,而您正在使用use关键字,则可能是您的问题。

您需要做的是在函数名称前的使用括号中添加“&”符号,以通过引用传递函数。如果无法通过引用传递,则在声明函数之前,函数变量将采用其值(最有可能为NULL)。


看一下下面的脚本。查找use关键字和'&'符号。

$killTheCat = function($lives = 9) use (&$killTheCat) {
$lives--;
echo 'Running, ';
if ($lives > 0) {
echo 'lives = '.$lives.'!'.PHP_EOL;
$killTheCat($lives);
} elseif ($lives <= 0) {
echo 'lives == 0 and the cat is dead.'.PHP_EOL;
}
};

$killTheCat();
/**
* Running, lives = 8!
* Running, lives = 7!
* Running, lives = 6!
* Running, lives = 5!
* Running, lives = 4!
* Running, lives = 3!
* Running, lives = 2!
* Running, lives = 1!
* Running, lives == 0 and the cat is dead.
*/