PHP 7.4 新语法之箭头函数实例详解


Posted in PHP onMay 09, 2019

短闭包,也叫做箭头函数,是一种用 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个关键字( function 和 return )将不会有太大区别。

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

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

外部作用域的值

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

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

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

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

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

发展前景

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

class Post {
  private $title;

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

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

总结

以上所述是小编给大家介绍的PHP 7.4 新语法之箭头函数实例详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

PHP 相关文章推荐
在PHP中读取和写入WORD文档的代码
Apr 09 PHP
php 设计模式之 单例模式
Dec 19 PHP
php 404错误页面实现代码
Jun 22 PHP
php文本转图片自动换行的方法
Mar 13 PHP
PHP Switch 语句之学习笔记
Sep 21 PHP
简单说说PHP优化那些事(经验分享)
Nov 27 PHP
完美解决thinkphp验证码出错无法显示的方法
Dec 09 PHP
新浪微博OAuth认证和储存的主要过程详解
Mar 27 PHP
PHP实现linux命令tail -f
Feb 22 PHP
浅析Yii2 gridview实现批量删除教程
Apr 22 PHP
php使用pdo连接sqlite3的配置示例
May 27 PHP
Win10 下安装配置IIS + MySQL + nginx + php7.1.7
Aug 04 PHP
PHP文件类型检查及fileinfo模块安装使用详解
May 09 #PHP
php使用mysqli和pdo扩展,测试对比mysql数据库的执行效率完整示例
May 09 #PHP
php使用mysqli和pdo扩展,测试对比连接mysql数据库的效率完整示例
May 09 #PHP
PHP CURL中传递cookie的方法步骤
May 09 #PHP
PHP正则表达式处理函数(PCRE 函数)实例小结
May 09 #PHP
Laravel配置全局公共函数的方法步骤
May 09 #PHP
Laravel Validator自定义错误返回提示消息并在前端展示
May 09 #PHP
You might like
也谈 PHP 和 MYSQL
2006/10/09 PHP
PHP自动选择 连接本地还是远程数据库
2010/12/02 PHP
PHP截取指定图片大小的方法
2014/12/10 PHP
php基于GD库画五星红旗的方法
2015/02/24 PHP
php实现俄罗斯乘法实例
2015/03/07 PHP
PHP register_shutdown_function()函数的使用示例
2015/06/23 PHP
php的常量和变量实例详解
2017/06/27 PHP
jQuery学习笔记之jQuery的DOM操作
2010/12/22 Javascript
jQuery选择器简明总结(含用法实例,一目了然)
2014/04/25 Javascript
js中string转int把String类型转化成int类型
2014/08/13 Javascript
jQuery子窗体取得父窗体元素的方法
2015/05/11 Javascript
JS利用cookie记忆当前位置的防刷新导航效果
2015/10/15 Javascript
KVM虚拟化技术之使用Qemu-kvm创建和管理虚拟机的方法
2016/10/05 Javascript
用angular实现多选按钮的全选与反选实例代码
2017/05/23 Javascript
js实现多张图片延迟加载效果
2017/07/17 Javascript
jQury Ajax使用Token验证身份实例代码
2017/09/22 Javascript
js合并两个数组生成合并后的key:value数组
2018/05/09 Javascript
JavaScript中工厂函数与构造函数示例详解
2019/05/06 Javascript
微信小程序实现聊天室
2020/08/21 Javascript
详解如何在Javascript中使用Object.freeze()
2020/10/18 Javascript
Vue包大小优化的实现(从1.72M到94K)
2021/02/18 Vue.js
[01:00:54]TI4正赛第二日开场
2014/07/20 DOTA
Python基于list的append和pop方法实现堆栈与队列功能示例
2017/07/24 Python
Python科学画图代码分享
2017/11/29 Python
python实现Floyd算法
2018/01/03 Python
Python中optparser库用法实例详解
2018/01/26 Python
python修改txt文件中的某一项方法
2018/12/29 Python
python实现图书借阅系统
2019/02/20 Python
python生成任意频率正弦波方式
2020/02/25 Python
Xadmin+rules实现多选行权限方式(级联效果)
2020/04/07 Python
美国沃尔玛网上超市:Walmart
2020/08/14 全球购物
心得体会开头
2014/01/01 职场文书
2019交通安全宣传标语集锦!
2019/06/28 职场文书
高端收音机+蓝牙音箱,JBL TUNER FM带收音蓝牙音箱评测
2021/04/24 无线电
MySQL 常见的数据表设计误区汇总
2021/06/07 MySQL
再次探讨go实现无限 buffer 的 channel方法
2021/06/13 Golang