PHP 7.4 新语法:箭头函数

栏目: PHP · 发布时间: 4年前

内容简介:短闭包,也叫做箭头函数,是一种用 php 编写的短函数.当向函数中传递闭包时,这个功能是非常有用的,比如使用这就是它们看起来的样子:

PHP 7.4 新语法:箭头函数

短闭包,也叫做箭头函数,是一种用 php 编写的短函数.当向函数中传递闭包时,这个功能是非常有用的,比如使用 array_map 或是 array_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 关键字可忽略
  • 参数和返回类型均可做类型暗示

上面示例更严格的类型限定写法可写作:

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

有两点需要提及:

  • 还允许使用扩展操作符
  • 允许引用,两个参数都可以作为返回值

假如你想要通过引用的方式返回结果,应该使用以下语法:

fn&($x) => $x

简而言之,除了只允许一个表达式以外,简短的闭包和普通闭包的功能是一样的。

单行

你应该正确的理解它:短闭包只能有 一个 表达式。这意味着闭包体中不能有多行。

原因如下:短闭包的目的是为了减少冗余。当然,在任何情况下, fn 都比 function 短。然而, RFC 的创建者 Nikita Popov 认为,如果你要处理的是多行表达式的函数,那么使用闭包获得的益处就更少了。

毕竟,多行闭包的定义已经很冗余了,所以,有和没有这2个关键字( functionreturn )将不会有太大区别。

你是否同意这个观点取决于你自己。虽然我可以在我的项目中想到很多单行闭包的场景,但也有很多多行闭包的情况,从个人角度,我会喜欢这些情况下的简短语法。

不过还是有希望的:未来可能会添加多行短闭包,但那也是一个单独的 RFC 。

外部作用域的值

短闭包和普通闭包的另一个显著特征是,短闭包不需要用 use 关键字就能访问外部作用域的数据。

$modifier = 5;

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

需要注意的是,不能修改外部范围中的变量。因为它属于值传递而不是引用传递。这意味着你 可以 改变短闭包内的 $modifier 变量,但它不会对外部作用域中的 $modifier 变量产生影响。

当然,有一个例外,那就是 $this 关键字,它的作用与普通闭包中的作用完全相同:

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

发展前景

我已经提到过的多行闭包仍然是将来的一个发展可能.另外一个在我脑海中的想法就是在允许在类中使用短闭包,比如 getterssetters 函数.

class Post {
    private $title;

    fn getTitle() => $this->title;
}

总而言之,短闭包是一个很受欢迎的特性,尽管有很多地方需要提高.其中最有可能就是多行闭包了.

文章转自: https://learnku.com/php/t/28219

更多文章: https://learnku.com/php/c/tra...


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

JavaScript and Ajax for the Web, Sixth Edition

JavaScript and Ajax for the Web, Sixth Edition

Tom Negrino、Dori Smith / Peachpit Press / August 28, 2006 / $24.99

Book Description Need to learn JavaScript fast? This best-selling reference’s visual format and step-by-step, task-based instructions will have you up and running with JavaScript in no time. In thi......一起来看看 《JavaScript and Ajax for the Web, Sixth Edition》 这本书的介绍吧!

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

html转js在线工具
html转js在线工具

html转js在线工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换