
箭头函数(也称为短闭包 )是用PHP编写干净代码的好方法。 当将闭包传递给array_map
或array_filter
类的函数时,这种书写形式将非常有用。
一个例子:
它以前是这样写的:
$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
上要短。 跳过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和setter:
class Post { private $title; fn getTitle() => $this->title; }
通常,箭头功能是一个很好的功能,尽管仍有改进的余地。
您对此有什么想法吗?