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+MYSQL 出现乱码的解决方法
Aug 08 PHP
window+nginx+php环境配置 附配置搭配说明
Dec 29 PHP
PHP文件读写操作之文件写入代码
Jan 13 PHP
php cc攻击代码与防范方法
Oct 18 PHP
php中防止SQL注入的最佳解决方法
Apr 25 PHP
PHP在线生成二维码(google api)的实现代码详解
Jun 04 PHP
学习php分页代码实例
Oct 24 PHP
php构造函数实例讲解
Nov 13 PHP
php给一组指定关键词添加span标签的方法
Mar 31 PHP
php+jQuery实现的三级导航栏下拉菜单显示效果
Aug 10 PHP
YII2框架中使用RBAC对模块,控制器,方法的权限控制及规则的使用示例
Mar 18 PHP
详解thinkphp的Auth类认证
May 28 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
C# WinForm中实现快捷键自定义设置实例
2015/01/23 PHP
ThinkPHP框架使用redirect实现页面重定向的方法实例分析
2018/04/12 PHP
php高清晰度无损图片压缩功能的实现代码
2018/12/09 PHP
Javascript对象中关于setTimeout和setInterval的this介绍
2012/07/21 Javascript
ExtJS4中使用mixins实现多继承示例
2013/12/03 Javascript
js用typeof方法判断undefined类型
2014/07/15 Javascript
javascript实用方法总结
2015/02/06 Javascript
jquery插件tytabs.jquery.min.js实现渐变TAB选项卡效果
2015/08/25 Javascript
js实现拖拽效果(构造函数)
2015/12/14 Javascript
JS检测移动端横竖屏的代码
2016/05/30 Javascript
如何检测JavaScript的各种类型
2016/07/30 Javascript
bootstrap基本配置_动力节点Java学院整理
2017/07/14 Javascript
jQuery Layer弹出层传值到父页面的实现代码
2017/08/17 jQuery
在Vue组件中获取全局的点击事件方法
2018/09/06 Javascript
layDate插件设置开始和结束时间
2018/11/15 Javascript
微信小程序自定义带价格显示日历效果
2018/12/29 Javascript
微信小程序实现九宫格抽奖
2020/04/15 Javascript
vue实现吸顶、锚点和滚动高亮按钮效果
2019/10/21 Javascript
浅析webpack-bundle-analyzer在vue-cli3中的使用
2019/10/23 Javascript
小程序实现录音上传功能
2019/11/22 Javascript
vue和小程序项目中使用iconfont的方法
2020/05/19 Javascript
快速了解Vue父子组件传值以及父调子方法、子调父方法
2020/07/15 Javascript
[02:49:21]2019完美盛典全程录像
2019/12/08 DOTA
寻找网站后台地址的python脚本
2014/09/01 Python
Windows下用py2exe将Python程序打包成exe程序的教程
2015/04/08 Python
pandas ix &iloc &loc的区别
2019/01/10 Python
Tensorflow进行多维矩阵的拆分与拼接实例
2020/02/07 Python
django model的update时auto_now不被更新的原因及解决方式
2020/04/01 Python
Django中从mysql数据库中获取数据传到echarts方式
2020/04/07 Python
Tripadvisor新西兰:阅读评论,比较价格和酒店预订
2018/02/10 全球购物
有趣的睡衣和礼物:LazyOne
2019/11/27 全球购物
服装机修工岗位职责
2013/12/26 职场文书
物业管理专业求职信
2014/06/11 职场文书
幼儿园大班见习报告
2014/10/31 职场文书
2014年评职称工作总结
2014/11/20 职场文书
小学生安全保证书
2015/05/09 职场文书