PHP 7.4中的箭头函数


箭头函数(也称为短闭包 )是用PHP编写干净代码的好方法。 当将闭包传递给array_maparray_filter类的函数时,这种书写形式将非常有用。


一个例子:


 //   Post $posts = [/* … */]; $ids = array_map(fn($post) => $post->id, $posts); 

它以前是这样写的:


 $ids = array_map(function ($post) { return $post->id; }, $posts); 

简要地:


  • 自PHP 7.4起可用
  • 以关键字fn开头
  • 只能有一个表达式,这也是返回值。
  • 不支持return
  • 参数和返回值支持Type-hintihg

上面示例的刻板印象:


 $ids = array_map(fn(Post $post): int => $post->id, $posts); 

另外两件重要的事情:


  • 支持变量运算符
  • 参数和返回值均支持链接

如果要通过引用返回值,请使用以下语法:


 fn&($x) => $x 

箭头函数实现了与普通闭包相同的功能,它们仅包含一个表达式。


没有多行


您没看错:短路只能包含一个表达式。 这意味着您不能包含多行。


论据是这样的:短路的目的是减少冗长。 fn ,绝对比function上要短。 跳过functionreturn关键字不会更改任何内容,但是会使代码更具可读性。


您是否同意这种观点? 同时,借助单行函数的新语法,许多多行函数不会受到这种升级的限制。


希望将来会有一个带有简短公告和多行功能的RFC,但是到目前为止,这只是我的梦想。


来自外部范围的变量


短路故障和正常故障之间的另一个显着区别是,前者不需要使用use关键字从外部范围访问数据。


 $modifier = 5; array_map(fn($x) => $x * $modifier, $numbers); 

重要的是要注意您不能修改这些变量。 值是通过值而不是通过引用关联的。 这意味着您可以在短路内修改$modifier ,但这不会影响位于外部的$modifier变量。


唯一的例外是$this ,它将与普通版本完全相同:


 array_map(fn($x) => $x * $this->modifier, $numbers); 

未来机会


我已经在上面提到了多线短路的想法。 另一个有用的建议是允许在类中使用简短的语法,例如对于getter和setter:


 class Post { private $title; fn getTitle() => $this->title; } 

通常,箭头功能是一个很好的功能,尽管仍有改进的余地。


您对此有什么想法吗?

Source: https://habr.com/ru/post/zh-CN476242/


All Articles