PHP 7.4是PHP 7的下一个小版本,预计将于2019年11月28日发布到通用版。我们来看看PHP 7.4的新特性,它会让PHP更快更可靠。
当然,我更期待的是PHP 8。因为有些JIT提案已经被批准了,这可能会成为PHP的又一个里程碑。
PHP使用PHP 7.4有哪些新特性?
●支持数组内解包-数组扩展运算符
●箭头功能2.0(较短的闭合)
PHP 7.4将Spread运算符引入数组表达式
从PHP 5.6开始可用,参数解包是一种用于将数组和可遍历数组解包到参数列表中的语法。若要解压缩数组或可遍历数组,它必须以...(3分),如下例所示:
功能测试(...$ args){ var _ dump($ args);}
测试(1,2,3);
然而,PHP 7.4 RFC建议将该函数扩展到数组定义:
$arr = [...$ args];
扩展运算符的第一个好处是性能,RPC文档指出:
Spread运算符应该比array_merge具有更好的性能。这不仅是Spread运算符是一种语法结构,而且array_merge也是一种方法。或者在编译时,优化高效的常量数组
扩展运算符的一个显著优点是它支持任何可遍历的对象,而数组合并函数只支持数组。
以下是带有扩散运算符的数组中的参数示例:
$parts = ['apple ',' pear '];
$水果= ['香蕉','橘子',...$parts,‘西瓜’];
var _ dump($水果);
如果在PHP 7.3或更早版本中运行这段代码,PHP将抛出一个Parse错误:
分析错误:语法错误,意外的“...”(T _省略号),第3行的/app/spread-operator.php中需要']'
相反,PHP 7.4将返回一个数组
数组(5) {
[0]= >
弦(6)“香蕉”
[1]= >
字符串(6)“橙色”
[2]= >
弦(5)“苹果”
[3]= >
弦(4)“梨”
[4]= >
串串(10)“西瓜”
}
RFC声明我们可以多次扩展同一个数组。此外,我们可以在数组的任何地方使用扩展运算符语法,因为我们可以在扩展运算符之前或之后添加常规元素。因此,以下代码将按预期工作:
$arr1 = [1,2,3];
$arr2 = [4,5,6];
$arr3 = [...$arr1,...$ arr 2];
$arr4 = [...$arr1,...$arr3,7,8,9];
您也可以将函数返回的数组作为参数,并将其放入新数组中:
functionbuildArray{
return['red ',' green ',' blue '];
}
$arr1 = [...buildArray,'粉色','紫色','黄色'];
PHP 7.4输出以下数组:
数组(6) {
[0]= >
字符串(3)“红色”
[1]= >
字符串(5)“绿色”
[2]= >
字符串(4)“蓝色”
[3]= >
弦乐(4)“粉色”
[4]= >
弦乐(6)“紫罗兰”
[5]= >
字符串(6)“黄色”
}
我们也可以使用发电机:
函数生成器{
for($ I = 3;$i <。= 5;$i++) {
收益$ I;
}
}
$arr1 = [0,1,2,...发电机];
但是,不允许通过引用传递。请考虑以下示例:
$arr1 = ['红色','绿色','蓝色'];
$arr2 = [...& amp$ arr 1];
如果我们试图传递一个引用,PHP会抛出以下解析错误:
分析错误:语法错误,意外的' & amp'in /app/spread-operator.php第3行
如果第一个数组的元素是通过引用存储的,那么它们也会通过引用存储在第二个数组中。这是一个例子:
$ arr0 = ' red
$ arr 1 =[& amp;$arr0,'绿色','蓝色'];
$arr2 = ['white ',...$arr1,' black '];
这就是我们从PHP 7.4得到的:
数组(5) {
[0]= >
字符串(5)“白色”
[1]= >
& amp字符串(3)“红色”
[2]= >
字符串(5)“绿色”
[3]= >
字符串(4)“蓝色”
[4]= >
字符串(5)“黑色”
}
箭头功能2.0(短闭合)
在PHP中,匿名函数被认为非常冗长,难以实现和维护。RFC建议引入更简单、更清晰的箭头函数(或简称闭包)语法,这样我们可以简洁地编写代码。
PHP 7.4之前:
functioncube($n){
return($ n * $ n * $ n);
}
$a = [1,2,3,4,5];
$b = array_map('cube ',$ a);
print _ r($ b);
PHP 7.4允许更简单的语法,上面的函数可以重写如下:
$a = [1,2,3,4,5];
$ b = array _ map(fn($ n)= & gt;$n * $n * $n,$ a);
print _ r($ b);
目前,由于语言结构的原因,匿名函数(闭包)可以用来继承父作用域中定义的变量,如下所示:
$ factor = 10
$ calc = function($ num)use($ factor){
返回$ num * $ factor
};
但是,在PHP 7.4中,父作用域的值被隐式捕获(由值的作用域隐式绑定)。所以我们可以用一行来完成这个功能:
$ factor = 10
$calc = fn($num) =>。$ num * $ factor
父作用域定义的变量可以用在arrow函数中,相当于我们使用的use,不能被父作用域修改。
新的语法是对语言的巨大改进,因为它允许我们构建更易读和可维护的代码。
空合并运算符
因为在日常使用中有很多三进制表达式和isset同时使用的情况,所以我们加入null组合运算符(??)这个语法糖。如果一个变量存在,并且它的值不为空,它将返回它自己的值,否则它将返回它的第二个操作数。
$username = $_GET['user']??没人;
这段代码的功能非常简单:它获取请求参数,如果不存在,则设置默认值。但是在RFC的例子中,如果我们有一个更长的变量名呢?
$this->。请求->;data[' comments '][' user _ id ']= $ this-& gt。请求->;data['comments']['user_id']??值';
从长远来看,这段代码可能很难维护。所以为了帮助开发人员写出更直观的代码,这个RFC建议引入null _ concert _ equal _ operator??=,因此我们可以键入以下代码来代替上面的代码:
$this->。请求->;data['comments']['user_id']??= ' value
如果左参数的值为空,则使用右参数的值。
1.《php7 令人期待的PHP7.4》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。
2.《php7 令人期待的PHP7.4》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。
3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/guoji/1618246.html