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 XML备份Mysql数据库
May 27 PHP
PHP写杨辉三角实例代码
Jul 17 PHP
php数组函数序列之array_key_exists() - 查找数组键名是否存在
Oct 29 PHP
PHP测试程序运行时间的类
Feb 05 PHP
解析PHP实现多进程并行执行脚本
Jun 18 PHP
php查询mysql大量数据造成内存不足的解决方法
Mar 04 PHP
php判断两个日期之间相差多少个月份的方法
Jun 18 PHP
PHP YII框架开发小技巧之模型(models)中rules自定义验证规则
Nov 16 PHP
php原生导出excel文件的两种方法(推荐)
Nov 19 PHP
php与c 实现按行读取文件实例代码
Jan 03 PHP
php实现的统计字数函数定义与使用示例
Jul 26 PHP
php curl操作API接口类完整示例
May 21 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 GD 图像处理组件的常用函数总结
2010/04/28 PHP
php设置session值和cookies的学习示例
2014/03/21 PHP
php中json_encode UTF-8中文乱码的更好解决方法
2014/09/28 PHP
自编函数解决pathinfo()函数处理中文问题
2014/11/03 PHP
php绘图之生成饼状图的方法
2015/01/24 PHP
thinkphp5+layui实现的分页样式示例
2019/10/08 PHP
可缩放Reloaded-一个针对可缩放元素的复用组件
2007/03/10 Javascript
讲两件事:1.this指针的用法小探. 2.ie的attachEvent和firefox的addEventListener在事件处理上的区别
2007/04/12 Javascript
3种js实现string的substring方法
2015/11/09 Javascript
jQuery自适应轮播图插件Swiper用法示例
2016/08/24 Javascript
jQuery事件绑定方法学习总结(推荐)
2016/11/21 Javascript
非常优秀的JS图片轮播插件Swiper的用法
2017/01/03 Javascript
js 博客内容进度插件详解
2017/02/19 Javascript
React中常见的动画实现的几种方式
2018/01/10 Javascript
vue.js系列中的vue-fontawesome使用
2018/02/10 Javascript
浅谈FastClick 填坑及源码解析
2018/03/02 Javascript
解决vue select当前value没有更新到vue对象属性的问题
2018/08/30 Javascript
nuxt.js服务端渲染中axios和proxy代理的配置操作
2020/11/06 Javascript
[44:41]Fnatic vs Liquid 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
跟老齐学Python之类的细节
2014/10/13 Python
python搭建服务器实现两个Android客户端间收发消息
2018/04/12 Python
python爬虫之自制英汉字典
2019/06/24 Python
Python属性和内建属性实例解析
2020/01/14 Python
在jupyter notebook中调用.ipynb文件方式
2020/04/14 Python
Marks & Spencer爱尔兰:英国马莎百货
2016/04/20 全球购物
Lookfantastic希腊官网:英国知名美妆购物网站
2018/09/15 全球购物
大学军训自我鉴定
2013/12/15 职场文书
后进生转化工作制度
2014/01/17 职场文书
工地门卫岗位职责范本
2014/07/01 职场文书
仓管员岗位职责
2015/02/03 职场文书
大学生村官工作总结2015
2015/04/09 职场文书
拖欠货款起诉状
2015/05/20 职场文书
尊师重教主题班会
2015/08/14 职场文书
感谢师恩主题班会
2015/08/17 职场文书
Pycharm远程调试和MySQL数据库授权问题
2022/03/18 MySQL
JS实现九宫格拼图游戏
2022/06/28 Javascript