php - 在 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
致命错误:未捕获的错误:函数名称必须是字符串
解决方案
就像 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
在它之前是未定义的。
据我所知,在定义箭头函数时,没有任何机制可以通过引用进行绑定。
推荐阅读
- php - 无法从 MySQL 获取结果 PHP 访问 JSON 对象
- ios - iOS - SMS 安全码自动填充本地化支持
- powershell - powershell中无法识别的参数gcloud命令
- ios - 无法呈现/推送另一个视图控制器
- coreldraw - CorelDraw 编号宏
- c# - 在 ASP.NET Core 中引用 ASP.NET 框架 4.6.2,它使用 System.Web.HttpContext.Current
- api - 使用 GetSchedule API
- javascript - Visual Studio Cordova 使用 smtp 或任何其他方法发送邮件
- css - 使用具有最大宽度的 img 时,Flex 项目不正确地增长
- javascript - 读取通过其他 JS 脚本更改的 Text 的 TextContent