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二分法在IP地址查询中的应用
Aug 12 PHP
php数组应用之比较两个时间的相减排序
Aug 18 PHP
php 时间计算问题小结
Jan 04 PHP
php实现根据字符串生成对应数组的方法
Sep 22 PHP
PHP产生不重复随机数的5个方法总结
Nov 12 PHP
CentOS 上搭建 PHP7 开发测试环境
Feb 26 PHP
php生成网页桌面快捷方式
May 05 PHP
PHP不使用内置函数实现字符串转整型的方法示例
Jul 03 PHP
PHP读取并输出XML文件数据的简单实现方法
Dec 22 PHP
PDO::errorInfo讲解
Jan 28 PHP
PHP pthreads v3使用中的一些坑和注意点分析
Feb 21 PHP
THINKPHP5.1 Config的配置与获取详解
Jun 08 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判断用户是否关注微信公众号
2016/07/22 PHP
JavaScript 实现模态对话框 源代码大全
2009/05/02 Javascript
JQUERY1.6 使用方法四 检测浏览器
2011/11/23 Javascript
JQuery入门——用映射方式绑定不同事件应用示例
2013/02/05 Javascript
js日期时间补零的小例子
2013/03/05 Javascript
浏览器窗口加载和大小改变事件示例
2014/02/27 Javascript
javascript实现表单提交后,提交按钮不可用的方法
2015/04/18 Javascript
jQuery实现的向下图文信息滚动效果
2015/05/03 Javascript
jQuery实现下拉框左右移动(全部移动,已选移动)
2016/04/15 Javascript
react-native-fs实现文件下载、文本存储的示例代码
2017/09/22 Javascript
JavaScript引用类型Object常见用法实例分析
2018/08/08 Javascript
七行JSON代码把你的网站变成移动应用过程详解
2019/07/09 Javascript
vue实现标签云效果的方法详解
2019/08/28 Javascript
小程序瀑布流组件实现翻页与图片懒加载
2020/05/19 Javascript
[03:40]DOTA2英雄梦之声_第01期_炼金术士
2014/06/23 DOTA
Eclipse + Python 的安装与配置流程
2013/03/05 Python
python抓取网页时字符集转换问题处理方案分享
2014/06/19 Python
python内置函数:lambda、map、filter简单介绍
2017/11/16 Python
使用python编写简单的小程序编译成exe跑在win10上
2018/01/15 Python
redis之django-redis的简单缓存使用
2018/06/07 Python
提升Python效率之使用循环机制代替递归函数
2019/07/23 Python
python程序 创建多线程过程详解
2019/09/23 Python
Django继承自带user表并重写的例子
2019/11/18 Python
Python通过2种方法输出带颜色字体
2020/03/02 Python
Python调用.net动态库实现过程解析
2020/06/05 Python
MAC彩妆澳洲官网:M·A·C AU
2021/01/17 全球购物
致200米运动员广播稿
2014/02/06 职场文书
优秀学生评语大全
2014/04/25 职场文书
交警个人先进事迹材料
2014/05/11 职场文书
综治维稳工作承诺书
2014/08/30 职场文书
汽车转让协议书范本
2014/12/07 职场文书
护士医德考评自我评价
2015/03/03 职场文书
先进个人自荐书
2015/03/06 职场文书
整改通知书
2015/04/20 职场文书
2015年教师节广播稿
2015/08/19 职场文书
Mysql实现主从配置和多主多从配置
2021/06/02 MySQL