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 相关文章推荐
ThinkPHP php 框架学习笔记
Oct 30 PHP
使用淘宝IP库获取用户ip地理位置
Oct 27 PHP
php中Y2K38的漏洞解决方法实例分析
Sep 22 PHP
PHP数组和explode函数示例总结
May 08 PHP
ThinkPHP中html:list标签用法分析
Jan 09 PHP
mysql desc(DESCRIBE)命令实例讲解
Sep 24 PHP
php 无限分类 树形数据格式化代码
Oct 11 PHP
php 常用的系统函数
Feb 07 PHP
ZendFramework2连接数据库操作实例
Apr 18 PHP
浅谈Yii乐观锁的使用及原理
Jul 25 PHP
PHP lcfirst()函数定义与用法
Mar 08 PHP
tp5.1 实现setInc字段自动加1
Oct 18 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 MYSQL 数据备份类
2009/06/19 PHP
PHP简单处理表单输入的特殊字符的方法
2016/02/03 PHP
PHP编写学校网站上新生注册登陆程序的实例分享
2016/03/21 PHP
php生成酷炫的四个字符验证码
2016/04/22 PHP
web前端开发也需要日志
2010/12/09 Javascript
中文路径导致unitpngfix.js不正常的解决方法
2013/06/26 Javascript
页面右下角弹出提示框示例代码js版
2013/08/02 Javascript
js实现图片漂浮效果的方法
2015/03/02 Javascript
JQuery使用$.ajax和checkbox实现下次不在通知功能
2015/04/16 Javascript
JS实现IE状态栏文字缩放效果代码
2015/10/24 Javascript
jQuery Uploadify 上传插件出现Http Error 302 错误的解决办法
2015/12/12 Javascript
Javascript点击按钮随机改变数字与其颜色
2016/09/01 Javascript
正则中的回溯定义与用法分析【JS与java实现】
2016/12/27 Javascript
jQuery实现拖拽可编辑模块功能代码
2017/01/12 Javascript
JS查找字符串中出现最多的字符及个数统计
2017/02/04 Javascript
three.js加载obj模型的实例代码
2017/11/10 Javascript
Vue ElementUi同时校验多个表单(巧用new promise)
2018/06/06 Javascript
在 Vue 中编写 SVG 图标组件的方法
2020/02/24 Javascript
Javascript中window.name属性详解
2020/11/19 Javascript
javascript实现点击产生随机图形
2021/01/25 Javascript
[02:32]DOTA2亚洲邀请赛 C9战队出场宣传片
2015/02/07 DOTA
Python socket.error: [Errno 98] Address already in use的原因和解决方法
2014/08/25 Python
python中执行shell命令的几个方法小结
2014/09/18 Python
python协程用法实例分析
2015/06/04 Python
Centos7 Python3下安装scrapy的详细步骤
2018/03/15 Python
Python3.7实现验证码登录方式代码实例
2020/02/14 Python
python GUI库图形界面开发之PyQt5菜单栏控件QMenuBar的详细使用方法与实例
2020/02/28 Python
详解HTML5 LocalStorage 本地存储
2016/12/23 HTML / CSS
HTML5 WebGL 实现民航客机飞行监控系统
2019/07/25 HTML / CSS
科技开发中心办公室主任岗位责任制
2014/02/10 职场文书
2014年消防工作总结
2014/11/21 职场文书
先进党员事迹材料
2014/12/24 职场文书
2015年控辍保学工作总结
2015/05/18 职场文书
高中班主任培训心得体会
2016/01/07 职场文书
《追风筝的人》:人心中的成见是座大山,但请不忘初心
2019/11/15 职场文书
elementui的el-popover修改样式不生效的解决
2021/06/30 Javascript