PHP 7.1新特性的汇总介绍
一、可空类型
可空类型主要用于参数类型声明和函数返回值声明。
主要的两种形式如下:
<?php functionanswer():?int{ returnnull;//ok } functionanswer():?int{ return42;//ok } functionsay(?string$msg){ if($msg){ echo$msg; } }
从例子很容易理解,所指的就是通过?的形式表明函数参数或者返回值的类型要么为指定类型,要么为null。
此方法也可用于接口函数的定义:
<?php interfaceFooable{ functionfoo(?Fooable$f); }
但有一个需要注意的地方:如果函数本身定义了参数类型并且没有默认值,即使是可空的,也不能省略,否则会触发错误。如下:
<?php functionfoo_nullable(?Bar$bar){} foo_nullable(newBar);//可行 foo_nullable(null);//可行 foo_nullable();//不可行
但是如果以上函数的参数定义为?Bar$bar=null的形式,则第三种写法也是可行的。因为=null实际上相当于?的超集,对于可空类型的参数,可以设定null为默认值。
二、list的方括号简写
我们知道在PHP5.4之前只能通过array()来定义数组,5.4之后添加了[]的简化写法(省略了5个字符还是很实在的)。
<?php //5.4之前 $array=array(1,2,3); $array=array("a"=>1,"b"=>2,"c"=>3); //5.4及之后 $array=[1,2,3]; $array=["a"=>1,"b"=>2,"c"=>3];
引申到另外一个问题上,如果我们要把数组的值赋值给不同的变量,可以通过list来实现:
<?php list($a,$b,$c)=$array;
是否也可以通过[]的简写来实现呢?
<?php [$a,$b,$c]=$array;
以及下一个特性中会提到的list指定key:
<?php ["a"=>$a,"b"=>$b,"c"=>$c]=$array;
PHP7.1实现了这个特性。但是要注意的是:出现在左值中的[]并不是数组的简写,是list()的简写。
但是并不仅仅如此,新的list()的实现并不仅仅可以出现在左值中,也能在foreach循环中使用:
<?php foreach($pointsas["x"=>$x,"y"=>$y]){ var_dump($x,$y); }
不过因为实现的问题,list()和[]不能相互嵌套使用:
<?php //不合法 list([$a,$b],[$c,$d])=[[1,2],[3,4]]; //不合法 [list($a,$b),list($c,$d)]=[[1,2],[3,4]]; //合法 [[$a,$b],[$c,$d]]=[[1,2],[3,4]];
三、允许在list中指定key
上文提到过,新的list()的实现中可以指定key:
<?php $array=["a"=>1,"b"=>2,"c"=>3]; ["a"=>$a,"b"=>$b,"c"=>$c]=$array;
这也就相当于:
<?php $a=$array['a']; $b=$array['b']; $c=$array['c'];
和以往的区别在于以往的list()的实现相当于key只能是0,1,2,3的数字形式并且不能调整顺序。执行以下语句:
<?php list($a,$b)=[1=>'1',2=>'2'];
会得到PHPerror:Undefinedoffset:0...的错误。
而新的实现则可以通过以下方式来调整赋值:
<?php list(1=>$a,2=>$b)=[1=>'1',2=>'2'];
不同于数组的是,list并不支持混合形式的key,以下写法会触发解析错误:
<?php //Parseerror:syntaxerror,... list($unkeyed,"key"=>$keyed)=$array;
更复杂的情况,list也支持复合形式的解析:
<?php $points=[ ["x"=>1,"y"=>2], ["x"=>2,"y"=>1] ]; list(list("x"=>$x1,"y"=>$y1),list("x"=>$x2,"y"=>$y2))=$points; $points=[ "first"=>[1,2], "second"=>[2,1] ]; list("first"=>list($x1,$y1),"second"=>list($x2,$y2))=$points;
以及循环中使用:
<?php $points=[ ["x"=>1,"y"=>2], ["x"=>2,"y"=>1] ]; foreach($pointsaslist("x"=>$x,"y"=>$y)){ echo"Pointat($x,$y)",PHP_EOL; }
四、void返回类型
PHP7.0添加了指定函数返回类型的特性,但是返回类型却不能指定为void,7.1的这个特性算是一个补充:
<?php functionshould_return_nothing():void{ return1;//Fatalerror:Avoidfunctionmustnotreturnavalue }
以下两种情况都可以通过验证:
<?php functionlacks_return():void{ //valid } functionreturns_nothing():void{ return;//valid }
定义返回类型为void的函数不能有返回值,即使返回null也不行:
<?php functionreturns_one():void{ return1;//Fatalerror:Avoidfunctionmustnotreturnavalue } functionreturns_null():void{ returnnull;//Fatalerror:Avoidfunctionmustnotreturnavalue }
此外void也只适用于返回类型,并不能用于参数类型声明,或者会触发错误:
<?php functionfoobar(void$foo){//Fatalerror:voidcannotbeusedasaparametertype }
类函数中对于返回类型的声明也不能被子类覆盖,否则会触发错误:
<?php classFoo { publicfunctionbar():void{ } } classFoobarextendsFoo { publicfunctionbar():array{//Fatalerror:DeclarationofFoobar::bar()mustbecompatiblewithFoo::bar():void } }
五、类常量属性设定
这个特性说起来比较简单,就是现在类中的常量支持使用public、private和protected修饰了:
<?php classToken{ //常量默认为public constPUBLIC_CONST=0; //可以自定义常量的可见范围 privateconstPRIVATE_CONST=0; protectedconstPROTECTED_CONST=0; publicconstPUBLIC_CONST_TWO=0; //多个常量同时声明只能有一个属性 privateconstFOO=1,BAR=2; }
此外,接口(interface)中的常量只能是public属性:
<?php interfaceICache{ publicconstPUBLIC=0; constIMPLICIT_PUBLIC=1; }
为了应对变化,反射类的实现也相应的丰富了一下,增加了getReflectionConstant和getReflectionConstants两个方法用于获取常量的额外属性:
<?php classtestClass{ constTEST_CONST='test'; } $obj=newReflectionClass("testClass"); $const=$obj->getReflectionConstant("TEST_CONST"); $consts=$obj->getReflectionConstants();
六、多条件catch
在以往的try...catch语句中,每个catch只能设定一个条件判断:
<?php try{ //Somecode... }catch(ExceptionType1$e){ //处理ExceptionType1 }catch(ExceptionType2$e){ //处理ExceptionType2 }catch(\Exception$e){ //... }
新的实现中可以在一个catch中设置多个条件,相当于或的形式判断:
<?php try{ //Somecode... }catch(ExceptionType1|ExceptionType2$e){ //对于ExceptionType1和ExceptionType2的处理 }catch(\Exception$e){ //... }
对于异常的处理简化了一些。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家学习或者使用PHP7.1能有一定的帮助,如果有疑问大家可以留言交流。
附:源RFC地址
NullableTypes
Squarebracketsyntaxforarraydestructuringassignment
Allowspecifyingkeysinlist()
Generalizesupportofnegativestringoffsets
VoidReturnType
Classconstantvisibilitymodifiers
Multicatch