php

PHP 7.4中的箭头函数

dafenqi
2023-08-11 / 0 评论 / 20 阅读 / 正在检测是否收录...

PHP 7.4中的箭头函数

短闭包(也称为箭头函数)是用PHP编写短函数的一种方式。当将闭包传递给类似array_map或array_filter的函数时,此符号很有用。

这是他们的样子:

// A collection of Post objects
$posts = [//];
$ids = array_map(fn($post) => $post->id, $posts);
以前,您必须编写以下代码:

$ids = array_map(function ($post) {

return $post->id;

}, $posts);
让我们总结一下如何使用短闭包。

自PHP 7.4起可用
他们以fn关键字开头
它们只能有一个表达式,即return语句
不允许return关键字
参数和返回类型可以类型提示
上面示例的更严格类型的编写方式可能是:

$ids = array_map(fn(Post $post): int => $post->id, $posts);
还有两件事要提到:

还可以使用展开运算符
允许引用,这两个参数都作为返回值
如果要通过引用返回值,则应使用以下语法:

fn&($x) => $x

简而言之,除了仅允许一个表达式之外,短闭包还具有与普通闭包相同的功能。

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

理由如下:短闭包的目标是减少冗长。 fn当然比function所有情况都短。RFC的创建者Nikita Popov辩称,如果您要处理多行功能,则使用短闭包将带来的好处更少。

毕竟,按照定义,多行闭包已经更加冗长;因此能够跳过两个关键字(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;

}
总而言之,短闭包是一个受欢迎的功能,尽管仍有改进的空间。最大的一个可能是多行短闭包。

0

Deprecated: strtolower(): Passing null to parameter #1 ($string) of type string is deprecated in /www/wwwroot/testblog.58heshihu.com/var/Widget/Archive.php on line 1032

评论 (0)

取消