PHP 7.4 新语法:箭头函数

短闭包,也叫做箭头函数,是一种用 php 编写的短函数。当向函数中传递闭包时,这个功能是非常有用的,比如使用 array_map 或是 array_filter 函数时.

译者注:PHP7.4 计划于今年底发布,请见 Wiki:PHP 基础信息:发行计划

这就是它们看起来的样子:

1 // Post 对象的集合
2 $posts = [/* … */];
3
4 $ids = array_map(fn($post) => $post->id, $posts);
5 而以前,你必须这样写:
6
7 $ids = array_map(function ($post) {
8     return $post->id;
9 }, $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 函数.

1 class Post {
2     private $title;
3
4     fn getTitle() => $this->title;
5 }

总而言之,短闭包是一个很受欢迎的特性,尽管有很多地方需要提高。其中最有可能就是多行闭包了.

原文地址:https://www.cnblogs.com/a609251438/p/11869542.html

时间: 2024-11-10 18:55:59

PHP 7.4 新语法:箭头函数的相关文章

ES6新语法之---函数扩展(7)

这节学习ES6中对函数新增的方法和属性. 1.新增函数的参数默认值 参考S6系列第二篇:http://www.cnblogs.com/diweikang/p/8976854.html 2.新增了函数的rest参数 参考ES6系列第二篇:http://www.cnblogs.com/diweikang/p/8976854.html 3.length属性 作用:获取函数预期传入的参数个数. 指定默认值后,length属性将返回没有指定默认值参数的个数. (function (a) {}).lengt

2、Es常用语法 箭头函数、类

1.箭头函数 什么是箭头函数 箭头函数的语法非常简单,看一下最简单的箭头函数表示法 () => console.log('Hello') () => {console.log('Hello')} 等同于 function(){ console.log('hello') } 箭头函数里的this: 箭头函数里的this指向定义时的作用域 普通函数里的this指向调用者的作用域 箭头函数不绑定arguments let arrowfunc = () => console.log(argume

JavaScript ES6箭头函数指南

前言 胖箭头函数(Fat arrow functions),又称箭头函数,是一个来自ECMAScript 2015(又称ES6)的全新特性.有传闻说,箭头函数的语法=>,是受到了CoffeeScript 的影响,并且它与CoffeeScript中的=>语法一样,共享this上下文. 箭头函数的产生,主要由两个目的:更简洁的语法和与父作用域共享关键字this.接下来,让我们来看几个详细的例子. 新的函数语法 传统的JavaScript函数语法并没有提供任何的灵活性,每一次你需要定义一个函数时,你

ES6新语法概览

简介 ES6是JavaScript语言的新一代标准,加入了一些新的功能和语法,正式发布于2015年6月,亦称ES2015:该标准由ECMA(欧洲计算机制造联合会)的第39号技术专家委员会(TC39)制订,ES7正在制订中,据称会在2017年发布. 语法 箭头函数.this ES6中可以使用 => 作为函数表达形式,极简风格,参数+ => +函数体. var foo = function(){return 1;}; //等价于 let foo = () => 1; let nums = [

ES6——箭头函数与普通函数的区别

ES6标准新增了一种新的函数:Arrow Function(箭头函数). 为什么叫Arrow Function?因为它的定义用的就是一个箭头: 语法: //1.没有形参的时候 let fun = () => console.log('我是箭头函数'); fun(); //2.只有一个形参的时候()可以省略 let fun2 = a => console.log(a); fun2('aaa'); //3.俩个及俩个以上的形参的时候 let fun3 = (x,y) =>console.lo

JavaScript 箭头函数:适用与不适用场景

JavaScript 箭头函数:适用与不适用场景现代 JavaScript 中最引人注目的功能之一是引入了箭头函数,用 => 来标识. 这种函数有两大优点 – 非常简洁的语法,和更直观的作用域和 this的绑定. 这些优点有时导致箭头函数比其他形式的函数声明更受欢迎. 例如,受欢迎的 airbnb eslint 配置 会在您创建匿名函数时强制使用JavaScript箭头函数. 然而,就像工程中的任何东西一样,箭头函数优点很明显,同时也带来了一些负面的东西. 使用他们的时候需要权衡一下. 学习如何

ES6新特性(函数默认参数,箭头函数)

ES6新特性之 函数参数的默认值写法 和 箭头函数. 1.函数参数的默认值 ES5中不能直接为函数的参数指定默认值,只能通过以下的变通方式:   从上面的代码可以看出存在一个问题,当传入的参数为0或者false时,会直接取到后面的值,而不是传入的这个参数值. 那怎么解决呢?对于上图的代码,可以通过判断是否传入了num参数,没有就用默认值:   这种做法还是很麻烦的,而ES6则直接在参数定义里面设置函数参数的默认值,而且不用担心传入参数是0或者false会出错了: 2.箭头函数 箭头函数用 =>

ES6语法~解构赋值、箭头函数

2015年6月17日 ECMAScript 6发布正式版本 打开VSCode终端powershell:ctrl+` 1.         定义变量:let 使用var 定义的变量没有{ }限制,在条件中定义的i,全局中都可以使用,造成变量污染,有变量提升预解析作用,只提升变量名,不提升值!降低js代码的可阅读性 相同作用域内,let不允许重复声明变量!!否则报错!!但可以更改变量值 使用let定义的变量:不会有变量提升,必须先定义后使用,否则先使用会报错: ReferenceError 在for

总结常见的ES6新语法特性。

前言 ES6是即将到来的新版本JavaScript语言的标准,他给我们带来了更"甜"的语法糖(一种语法,使得语言更容易理解和更具有可读性,也让我们编写代码更加简单快捷),如箭头函数(=>).class等等.用一句话来说就是: ES6给我们提供了许多的新语法和代码特性来提高javascript的体验 不过遗憾的是,现在还没有浏览器能够很好的支持es6语法,点这里查看浏览器支持情况,所以我们在开发中还需要用babel进行转换为CommonJS这种模块化标准的语法. 因为下面我会讲到一