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制作简单的内容采集器的原理分析
Oct 01 PHP
php cli 小技巧
Jun 03 PHP
php Calender(日历)代码分享
Jan 03 PHP
为PHP安装imagick时出现Cannot locate header file MagickWand.h错误的解决方法
Nov 03 PHP
smarty模板引擎使用内建函数foreach循环取出所有数组值的方法
Jan 22 PHP
Codeigniter发送邮件的方法
Mar 19 PHP
PHP编程入门的基本语法知识点总结
Jan 26 PHP
php读取qqwry.dat ip地址定位文件的类实例代码
Nov 15 PHP
老生常谈PHP 文件写入和读取(必看篇)
May 22 PHP
PHP中常用的三种设计模式详解【单例模式、工厂模式、观察者模式】
Jun 14 PHP
Laravel5.1 框架路由基础详解
Jan 04 PHP
如何在PHP中生成随机数
Jun 04 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
Cappuccino 卡布其诺咖啡之制作
2021/03/03 冲泡冲煮
PHP 文本文章分页代码 按标记或长度(不涉及数据库)
2012/06/07 PHP
解析posix与perl标准的正则表达式区别
2013/06/17 PHP
PHP empty函数报错解决办法
2014/03/06 PHP
php计算程序运行时间的简单例子分享
2014/05/10 PHP
php实现批量压缩图片文件大小的脚本
2014/07/04 PHP
User Scripts: Video Download by User Scripts
2007/05/14 Javascript
js实现的类似于asp数据字典的数据类型代码实例
2014/09/03 Javascript
jQuery simplePage+AJAX plus分页插件用法实例
2016/02/17 Javascript
Vue.js一个文件对应一个组件实践
2016/10/27 Javascript
jQuery实现弹窗居中效果类似alert()
2017/02/27 Javascript
单行 JS 实现移动端金钱格式的输入规则
2017/05/22 Javascript
超出JavaScript安全整数限制的数字计算BigInt详解
2018/06/24 Javascript
javascript显示动态时间的方法汇总
2018/07/06 Javascript
vue组件开发之用户无限添加自定义填写表单的方法
2018/08/28 Javascript
vue-cli脚手架build目录下utils.js工具配置文件详解
2018/09/14 Javascript
JS二级菜单不同实现方法分析【4种方法】
2018/12/21 Javascript
uni-app 自定义底部导航栏的实现
2020/12/11 Javascript
Python sys.path详细介绍
2013/10/17 Python
Python读写Excel文件方法介绍
2014/11/22 Python
基于hashlib模块--加密(详解)
2017/06/21 Python
对python Tkinter Text的用法详解
2018/10/11 Python
python Kmeans算法原理深入解析
2019/08/23 Python
python实现ip地址的包含关系判断
2020/02/07 Python
在PyCharm中实现添加快捷模块
2020/02/12 Python
Python实现检测文件的MD5值来查找重复文件案例
2020/03/12 Python
python 爬取免费简历模板网站的示例
2020/09/27 Python
python使用scapy模块实现ping扫描的过程详解
2021/01/21 Python
使用CSS3实现圆角,阴影,透明
2014/12/23 HTML / CSS
html5实现canvas阴影效果示例
2014/05/07 HTML / CSS
详解canvas绘图时遇到的跨域问题
2018/03/22 HTML / CSS
在线购买澳大利亚设计师手拿包和奢华晚装手袋:Olga Berg
2019/03/20 全球购物
美国电子产品主要品牌的授权在线零售商:DataVision
2019/03/23 全球购物
美国在线购买和出售礼品卡网站:EJ Gift Cards
2019/06/09 全球购物
Final类有什么特点
2012/04/25 面试题
浅谈由position属性引申的css进阶讨论
2021/05/25 HTML / CSS