首页 > 解决方案 > 在 php 7.4 中重写匿名函数

问题描述

有以下匿名递归函数:

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

echo $f(5); // 120

我尝试重写到 7.4 版,但出现错误,请告诉我我缺少什么?

$f = fn($n) => ($n == 1) ? 1 : $n * $f($n - 1);
echo $f(5);

注意:未定义变量:f

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

标签: phpclosuresanonymous-functionarrow-functionsphp-7.4

解决方案


就像 Barmar 说的,你不能$f从外部范围使用,因为当隐式绑定发生时$f仍然是未定义的。

没有什么能阻止您稍后将其作为参数传递。

$f = fn($f, $n) => $n == 1 ? 1 : $n * $f($f, $n - 1);
echo $f($f, 5); // 120

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

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

闭包对变量的赋值$f发生在闭包定义之后,而变量$f在它之前是未定义的。

据我所知,在定义箭头函数时,没有任何机制可以通过引用进行绑定。


推荐阅读