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用户指南-cookies部分
Oct 09 PHP
在PWS上安装PHP4.0正式版
Oct 09 PHP
比较时间段一与时间段二是否有交集的php函数
May 31 PHP
php设计模式 Bridge (桥接模式)
Jun 26 PHP
php的chr和ord函数实现字符加减乘除运算实现代码
Dec 05 PHP
PHP 正则表达式常用函数
Aug 17 PHP
PHP批量去除BOM头内容信息代码
Mar 11 PHP
yii通过小物件生成view的方法
Oct 08 PHP
php基于dom实现读取图书xml格式数据的方法
Feb 03 PHP
Yii2实现ActiveForm ajax提交
May 26 PHP
php微信分享到朋友圈、QQ、朋友、微博
Feb 18 PHP
Smarty缓存机制实例详解【三种缓存方式】
Jul 20 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笔记之:php函数range() round()和list()的使用说明
2013/04/26 PHP
php转换颜色为其反色的方法
2015/04/27 PHP
PHP 匿名函数与注意事项详细介绍
2016/11/26 PHP
PHP与JavaScript针对Cookie的读写、交互操作方法详解
2017/08/07 PHP
laravel实现于语言包的完美切换方法
2019/09/29 PHP
php使用gearman进行任务分发操作实例详解
2020/02/26 PHP
JavaScript 不只是脚本
2007/05/30 Javascript
深入理解JavaScript系列(3) 全面解析Module模式
2012/01/15 Javascript
淘宝网提供的国内NPM镜像简介和使用方法
2014/04/17 Javascript
jquery实现Slide Out Navigation滑出式菜单效果代码
2015/09/07 Javascript
jQuery表单验证插件解析(推荐)
2016/07/21 Javascript
Laydate时间组件在火狐浏览器下有多时间输入框时只能给第一个输入框赋值的解决方法
2016/08/18 Javascript
jQuery使用正则表达式替换dom元素标签用法示例
2017/01/16 Javascript
js实时监控文本框输入字数的实例代码
2018/01/18 Javascript
JS动画定时器知识总结
2018/03/23 Javascript
vue mint-ui tabbar变组件使用
2018/05/04 Javascript
vue中的router-view组件的使用教程
2018/10/23 Javascript
jquery获取img的src值实例介绍
2019/01/16 jQuery
详解Vue中watch对象内属性的方法
2019/02/01 Javascript
vue自定义指令实现方法详解
2019/02/11 Javascript
mpvue 项目初始化及实现授权登录的实现方法
2020/07/20 Javascript
[59:32]Liquid vs Fnatic 2019国际邀请赛淘汰赛败者组BO1 8.20.mp4
2020/07/19 DOTA
[48:31]完美世界DOTA2联赛PWL S3 DLG vs Phoenix 第二场 12.17
2020/12/19 DOTA
python实现文件名批量替换和内容替换
2014/03/20 Python
Python的Django框架中的select_related函数对QuerySet 查询的优化
2015/04/01 Python
Python计时相关操作详解【time,datetime】
2017/05/26 Python
python 函数传参之传值还是传引用的分析
2017/09/07 Python
深入浅析python的第三方库pandas
2020/02/13 Python
Python基于wordcloud及jieba实现中国地图词云图
2020/06/09 Python
html5基础标签(html5视频标签 html5新标签用法)
2013/12/30 HTML / CSS
SheIn沙特阿拉伯:女装在线
2020/03/23 全球购物
酒店秘书求职信范文
2014/02/17 职场文书
公司活动方案范文
2014/03/06 职场文书
员工评语范文
2014/12/31 职场文书
亮剑观后感500字
2015/06/05 职场文书
2019数学教师下学期工作总结
2019/06/27 职场文书