php7.4新特性,PHP7新特性
开始介绍PHP7.0的新特性,详情请参考官网介绍。我选一些来详细解释一下。
http://php.net/manual/en/migration70.new-features.php
1.运算符(空合并运算符)
$a=$_GET[a]?1;
它相当于:
$a=empty($_GET[a])?1:$ _ GET[ a ];
我们知道三元运算符可以这样使用:
$a? 1
但这是建立在已经定义了$a的前提下的。新的?操作员可以简化判断。简化代码,让代码更直观!
2.函数返回值类型声明
官方文件提供的例子(注意边长参数语法.仅在PHP 5.6或更高版本中可用):
?服务器端编程语言(Professional Hypertext Preprocessor的缩写)
函数arraysSum(数组.$ arrays):array { return array _ map(function(array $ array):int { return array _ sum($ array);},$ arrays);} print _ r(arraysum([1,2,3],[4,5,6],[7,8,9]);
从这个例子可以看出,所有的函数(包括匿名函数)都可以指定返回值的类型。
这个特性可以帮助我们避免PHP隐式类型转换带来的一些问题。在定义函数之前考虑预期的结果可以避免一些不必要的错误。
但是,这里还有一个特点需要注意。PHP增加了一个declare指令:strict_types,它使用严格模式。
当使用返回值类型声明时,如果没有在严格模式下声明,PHP仍然会强制转换不是预期类型的返回值。但是,如果是严格模式,则会启动致命的TypeError错误。
强制模式:
# PHP致命错误:未捕获的类型错误:foo()的返回值必须是integer类型,在test.php:6中返回float
3.标量类型声明
PHP 7中函数的形参类型声明可以是标量。在PHP 5中,只能是类名、接口、数组或可调用的(PHP 5.4,即可以是函数,包括匿名函数)。现在,你也可以使用string,int,float和bool。
//h3制模式
函数sumOfInts(int.$ ints){ return array _ sum($ ints);} var_dump(sumOfInts(2, 3 ,4.1));
需要注意的是,上面提到的严格模式的问题在这里也是适用的:在强制模式下(默认为强制键入),不符合预期的参数仍然会被强制键入,在严格模式下,会触发TypeError的致命错误。
4.使用批量声明
PHP 7中的Use可以在一句话中声明多个类或函数或const:
?服务器端编程语言(Professional Hypertext Preprocessor的缩写)
使用一些命名空间{ClassA,ClassB,class C as C };
使用函数somenamespace{fn_a,fn_b,fn _ c };使用const somenamespace{ConstA,ConstB,ConstC };
但是你仍然必须写出每个类或函数或常量的名字(没有像python这样的import *的方法)。
需要注意的问题是:如果使用基于composer和PSR-4的框架,这种编写方式能成功加载类文件吗?其实是有可能的。composer注册的自动加载方式是在调用时根据类的命名空间找到位置。这种写法对它没什么影响。
再简单说几个:
1.PHP 5.3开始有匿名函数,现在有匿名类;
2.define现在可以定义一个常量数组;
3.一个调用方法被添加到闭包;
4.生成器(或者迭代器更合适)可以有一个最终返回值(return),也可以通过yield from的新语法输入另一个生成器(生成器委托)。
生成器的两个新功能(return和yield from)可以结合使用。你可以自己测试一下。