在PHP 7.4中重写匿名函数

Let*_*Pie 2 php closures anonymous-function arrow-functions php-7.4

有以下匿名递归函数:

$f = function($n) use (&$f) {
    return ($n == 1) ? 1 : $n * $f($n - 1);
};

echo $f(5); // 120
Run Code Online (Sandbox Code Playgroud)

我尝试重写为7.4版,但出现错误,请告诉我我所缺少的内容吗?

$f = fn($n) => ($n == 1) ? 1 : $n * $f($n - 1);
echo $f(5);
Run Code Online (Sandbox Code Playgroud)

注意:未定义的变量:f

致命错误:未捕获错误:函数名称必须是字符串

Dha*_*man 7

就像Barmar所说的那样,您不能$f在外部范围内使用,因为隐式绑定的发生$f时间仍然不确定。

没有什么可以阻止您以后将其作为参数传递的。

$f = fn($f, $n) => $n == 1 ? 1 : $n * $f($f, $n - 1);
echo $f($f, 5); // 120
Run Code Online (Sandbox Code Playgroud)

箭头函数的工作方式是,在定义期间,它们将使用外部作用域变量的按值绑定。

如前所述,箭头函数使用按值变量绑定。这大致等效于对arrow函数内部使用的use($x)每个变量执行a $x。- https://wiki.php.net/rfc/arrow_functions_v2

将闭包分配给变量是$f在闭包定义之后进行的,而变量$f在其定义之前是未定义的。

据我所知,在定义箭头函数时,没有机制可以绑定按引用。

  • 不错的解决方法。 (2认同)