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模板技术[转]
Jan 04 PHP
PHP 解决utf-8和gb2312编码转换问题
Mar 18 PHP
基于HBase Thrift接口的一些使用问题及相关注意事项的详解
Jun 03 PHP
PHP把网页保存为word文件的三种方法
Apr 01 PHP
PHP根据传入参数合并多个JS和CSS文件的简单实现
Jun 13 PHP
PHP解析RSS的方法
Mar 05 PHP
php动态绑定变量的用法
Jun 16 PHP
php限制文件下载速度的代码
Oct 20 PHP
PHP编辑器PhpStrom运行缓慢问题
Feb 21 PHP
Laravel5.* 打印出执行的sql语句的方法
Jul 24 PHP
关于php开启错误提示的总结
Sep 24 PHP
PHP Swoole异步读取、写入文件操作示例
Oct 24 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
解决163/sohu/sina不能够收到PHP MAIL函数发出邮件的问题
2009/03/13 PHP
ThinkPHP中__initialize()和类的构造函数__construct()用法分析
2014/11/29 PHP
PHP结合jQuery.autocomplete插件实现输入自动完成提示的功能
2015/04/27 PHP
详细解读php的命名空间(一)
2018/02/21 PHP
基于Laravel(5.4版本)的基本增删改查操作方法
2019/10/11 PHP
用js实现手把手教你月入万刀(转贴)
2007/11/07 Javascript
Javascript中的for in循环和hasOwnProperty结合使用
2013/06/05 Javascript
js 跳出页面的frameset框架示例介绍
2013/12/23 Javascript
现代 JavaScript 开发编程风格Idiomatic.js指南中文版
2014/05/28 Javascript
jquery.validate 自定义验证方法及validate相关参数
2016/01/18 Javascript
ajax在兼容模式下失效的快速解决方法
2016/03/22 Javascript
jQuery设置Cookie及删除Cookie实例分析
2016/04/15 Javascript
通过sails和阿里大于实现短信验证
2017/01/04 Javascript
jQuery实现Table表格隔行变色及高亮显示当前选择行效果示例
2017/02/14 Javascript
作为老司机使用 React 总结的 11 个经验教训
2017/04/08 Javascript
微信小程序之页面拦截器的示例代码
2017/09/07 Javascript
解决vue无法设置滚动位置的问题
2018/10/07 Javascript
js中null与空字符串""的区别讲解
2019/01/17 Javascript
小白教程|一小时上手最流行的前端框架vue(推荐)
2019/04/10 Javascript
如何通过javaScript去除字符串两端的空白字符
2020/02/06 Javascript
Vue实现图片轮播组件思路及实例解析
2020/05/11 Javascript
Python爬取成语接龙类网站
2018/10/19 Python
python 调用有道api接口的方法
2019/01/03 Python
python中count函数简单的实例讲解
2020/02/06 Python
使用Python 自动生成 Word 文档的教程
2020/02/13 Python
plt.figure()参数使用详解及运行演示
2021/01/08 Python
美体小铺奥地利官方网站:The Body Shop奥地利
2019/04/11 全球购物
您附近的水疗和健康场所:Spafinder(美国)
2019/07/05 全球购物
大学校庆策划书
2014/01/31 职场文书
员工考核管理制度
2014/02/02 职场文书
人力资源管理专业毕业生自荐书
2014/05/25 职场文书
社区平安建设方案
2014/05/25 职场文书
五四演讲稿范文
2014/09/03 职场文书
党的群众路线个人对照检查材料
2014/09/23 职场文书
2015年爱国卫生月活动总结
2015/03/26 职场文书
《从现在开始》教学反思
2016/02/16 职场文书