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 相关文章推荐
使用 eAccelerator加速PHP代码的方法
Sep 30 PHP
PHP MemCached 高级缓存应用代码
Aug 05 PHP
PHP正确配置mysql(apache环境)
Aug 28 PHP
通过PHP修改Linux或Unix口令的方法分享
Jan 30 PHP
Yii核心组件AssetManager原理分析
Dec 02 PHP
ThinkPHP入口文件设置及相关注意事项分析
Dec 05 PHP
微信公众平台开发之配置与请求
Aug 26 PHP
必须收藏的php实用代码片段
Feb 02 PHP
Laravel5.1数据库连接、创建数据库、创建model及创建控制器的方法
Mar 29 PHP
thinkPHP简单遍历数组方法分析
May 16 PHP
PHP实现的简单在线计算器功能示例
Aug 02 PHP
php DES加密算法实例分析
Sep 18 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
超外差式晶体管收音机的组装与统调
2021/03/01 无线电
php iconv() : Detected an illegal character in input string
2010/12/05 PHP
11个PHP 分页脚本推荐
2011/08/15 PHP
PHP isset()及empty()用法区别详解
2020/08/29 PHP
JScript中的"this"关键字使用方式补充材料
2007/03/08 Javascript
jquery中ajax调用json数据的使用说明
2011/03/17 Javascript
Javascript 异步加载详解(浏览器在javascript的加载方式)
2012/05/20 Javascript
圣诞节Merry Christmas给博客添加浪漫的下雪效果基于jquery实现
2012/12/27 Javascript
JQuery slideshow的一个小问题(如何发现及解决过程)
2013/02/06 Javascript
jquery简单的拖动效果实现原理及示例
2013/07/26 Javascript
推荐6款基于jQuery实现图片效果插件
2014/12/07 Javascript
jquery+Jscex打造游戏力度条
2020/09/12 Javascript
AngularJS控制器controller给模型数据赋初始值的方法
2017/01/04 Javascript
node.js中cluster的使用教程
2017/06/09 Javascript
JS实现按钮颜色切换效果
2020/09/05 Javascript
JS实现非首屏图片延迟加载的示例
2018/01/06 Javascript
JS实现移动端在线签协议功能
2019/08/22 Javascript
Vue Components 数字键盘的实现
2019/09/18 Javascript
微信小程序pinker组件使用实现自动相减日期
2020/05/07 Javascript
javascript实现评分功能
2020/06/24 Javascript
vue实现tab栏点击高亮效果
2020/08/19 Javascript
Vue-router编程式导航的两种实现代码
2021/03/04 Vue.js
Python GAE、Django导出Excel的方法
2008/11/24 Python
Python中SOAP项目的介绍及其在web开发中的应用
2015/04/14 Python
Linux下为不同版本python安装第三方库
2016/08/31 Python
python 连接sqlite及简单操作
2017/06/30 Python
Python中摘要算法MD5,SHA1简介及应用实例代码
2018/01/09 Python
Python代码缩进和测试模块示例详解
2018/05/07 Python
如何安装2019Pycharm最新版本(详细教程)
2019/09/26 Python
用css3实现转换过渡和动画效果
2020/03/13 HTML / CSS
50道外企软件测试面试题
2014/08/18 面试题
车贷收入证明范本
2014/01/09 职场文书
餐饮总经理岗位职责
2014/03/07 职场文书
求职简历自我评价范例
2014/03/12 职场文书
2014民事授权委托书范本
2014/09/29 职场文书
评测 | 大屏显示带收音机的高端音箱,JBL TUNE2便携式插卡音箱实测
2021/04/24 无线电