简称闭包,又称箭头函数,是用php写的一个短函数。该函数在将闭包传递给函数时非常有用,例如使用array_map或array_filter函数。这就是它们的样子://Post对象的集合$posts=[/*...*/];$ids=array_map(fn($post)=>$post->id,$posts);以前,你必须这样写:$ids=array_map(function($post){return$post->id;},$posts);下面总结一下short闭包函数是如何使用的。在PHP7.4中,可以用fn关键字开头,只能包含一个表达式,即return表达式。return关键字可以忽略参数和返回类型作为类型提示。上面例子中类型限制比较严格的写法可以写成:$ids=array_map(fn(Post$post):int=>$post->id,$posts);有两点需要提一下:也允许使用展开运算符来允许引用,并且两个参数都可以作为返回值。如果要通过引用返回结果,应使用以下语法:fn&($x)=>$x简而言之,短闭包的功能与普通闭包相同,只是只允许使用一个表达式。One-liner你应该理解正确:短闭包只能有一个表达式。这意味着闭包体中不能有超过一行。原因如下:短闭包的目的是减少冗余。当然,fn在任何情况下都比function短。然而,RFC的创建者NikitaPopov争辩说,如果您正在处理具有多行表达式的函数,那么使用闭包将获得更少的好处。毕竟,多行闭包的定义已经是多余的了,所以有和没有这两个关键字(function和return)不会有太大区别。你是否同意这个观点取决于你。虽然在我的项目中我能想到很多单行闭包的情况,但也有很多多行闭包的情况,就我个人而言,我想要这些情况的简短语法。不过还是有希望的:将来可能会添加多行短闭包,但这也是一个单独的RFC。短闭包和普通闭包的另一个显着特征是短闭包不需要use关键字来访问外部范围内的数据。$modifier=5;array_map(fn($x)=>$x*$modifier,$numbers);需要注意的是,外部范围内的变量是不能修改的。因为它是按值传递而不是按引用传递。这意味着您可以更改短闭包内的$modifier变量,但它不会影响外部范围内的$modifier变量。当然,有一个例外,那就是$this关键字,它与普通闭包中的作用完全相同:array_map(fn($x)=>$x*$this->modifier,$numbers);我已经提到的多行关闭仍然是未来的可能性。我想到的另一个想法是允许类中的短闭包,例如getter和setterfunctions.classPost{private$title;fngetTitle()=>$this->title;}总而言之,短闭包是一个非常受欢迎的特性,尽管还有很多地方需要改进。最有可能的是多行闭包。文章转自:https://learnku.com/php/t/28219更多文章:https://learnku.com/php/c/tra...
