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_xmlhttp 乱码问题解决方法
Aug 07 PHP
php递归实现无限分类生成下拉列表的函数
Aug 08 PHP
PHP学习之数组值的操作
Apr 17 PHP
php分页示例分享
Apr 30 PHP
ThinkPHP CURD方法之table方法详解
Jun 18 PHP
thinkphp中memcache的用法实例
Nov 29 PHP
php使用curl详细解析及问题汇总
Aug 11 PHP
一个简单安全的PHP验证码类、PHP验证码
Sep 24 PHP
10个值得深思的PHP面试题
Nov 14 PHP
centos下file_put_contents()无法写入文件的原因及解决方法
Apr 01 PHP
PHP实现限制IP访问的方法
Apr 20 PHP
PHP正则删除HTML代码中宽高样式的方法
Jun 12 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中动态HTML的输出技术
2006/10/09 PHP
在Windows下编译适用于PHP 5.2.12及5.2.13的eAccelerator.dll(附下载)
2010/05/04 PHP
PHP strncasecmp字符串比较的小技巧
2011/01/04 PHP
浅析PHP绘图技术
2013/07/03 PHP
php实现把url转换迅雷thunder资源下载地址的方法
2014/11/07 PHP
php中ob_get_length缓冲与获取缓冲长度实例
2014/11/20 PHP
PHP+jquery+ajax实现即时聊天功能实例
2014/12/23 PHP
php发送短信验证码完成注册功能
2015/11/24 PHP
PHP将页面中点击数量高的链接进行高亮显示的方法
2016/05/30 PHP
php redis实现文章发布系统(用户投票系统)
2017/03/04 PHP
thinkPHP5.0框架自动加载机制分析
2017/03/18 PHP
JavaScript DOM学习第八章 表单错误提示
2010/02/19 Javascript
js格式化时间和js格式化时间戳示例
2014/02/10 Javascript
JavaScript导出Excel实例详解
2014/11/25 Javascript
jQuery内容过滤选择器用法分析
2015/02/10 Javascript
JS模拟Dialog弹出浮动框效果代码
2015/10/16 Javascript
浅谈MVC+EF easyui dataGrid 动态加载分页表格
2016/11/10 Javascript
深入理解Vue父子组件生命周期执行顺序及钩子函数
2018/08/12 Javascript
nodejs读取本地中文json文件出现乱码解决方法
2018/10/10 NodeJs
nodejs 使用nodejs-websocket模块实现点对点实时通讯
2018/11/28 NodeJs
javascript 对象 与 prototype 原型用法实例分析
2019/11/11 Javascript
微信小程序换肤功能实现代码(思路详解)
2020/08/25 Javascript
wxpython中利用线程防止假死的实现方法
2014/08/11 Python
Python中的类与对象之描述符详解
2015/03/27 Python
python的变量与赋值详细分析
2017/11/08 Python
Python定义函数实现累计求和操作
2020/05/03 Python
Python使用Paramiko控制liunx第三方库
2020/05/20 Python
Python Pillow(PIL)库的用法详解
2020/09/19 Python
Python学习工具jupyter notebook安装及用法解析
2020/10/23 Python
SOA面试题:如何在SOA中实现松耦合
2013/07/21 面试题
教师党员思想汇报
2014/01/06 职场文书
房地产开发项目建议书
2014/05/16 职场文书
公司市场专员岗位职责
2014/06/29 职场文书
2015年音乐教学工作总结
2015/07/22 职场文书
一文搞懂php的垃圾回收机制
2021/06/18 PHP
python如何查找列表中元素的位置
2022/05/30 Python