PHP7 新特性详细介绍
PHP的学习新特性
最近做的项目使用了php7,但感觉有很多新特性没有用起来。就想总结一下,一些可能会用到的新特性。之前使用的环境是php5.4,所有也会有php5.5和php5.6的特性总结进来,这里只列出我觉得在项目中可能用到的特性,主要内容来自php手册的附录。
Generators(PHP5>=5.5.0,PHP7)
通过添加yield关键字支持了generators,Generators提供了一个更简单的方法实现迭代器,不需要实现Iterator接口。
<?php functionxrange($start,$limit,$step=1){ for($i=$start;$i<=$limit;$i+=$step){ yield$i; } } echo'Singledigitoddnumbers:'; /*注意保存在内存中的数组绝不会被创建或返回*/ foreach(xrange(1,9,2)as$number){ echo"$number"; }
以上例程会输出:
Singledigitoddnumbers:13579
详情点击生成器
新增finally关键字(PHP5>=5.5.0,PHP7)
try-catch现在支持finally
foreach现在支持list()(PHP5>=5.5.0,PHP7)
foreach控制结构现在支持通过list()构造将嵌套数组分离到单独的变量。例如:
<?php $array=[ [1,2], [3,4], ]; foreach($arrayaslist($a,$b)){ echo"A:$a;B:$b\n"; } ?>
以上例程会输出:
A:1;B:2
A:3;B:4
array_column(PHP5>=5.5.0,PHP7)
array_column—返回数组中指定的一列
使用表达式定义常量(PHP5>=5.6.0,PHP7)
在之前的PHP版本中,必须使用静态值来定义常量,声明属性以及指定函数参数默认值。现在你可以使用包括数值、字符串字面量以及其他常量在内的数值表达式来定义常量、声明属性以及设置函数参数默认值。
<?php constONE=1; constTWO=ONE*2; classC{ constTHREE=TWO+1; constONE_THIRD=ONE/self::THREE; constSENTENCE='ThevalueofTHREEis'.self::THREE; publicfunctionf($a=ONE+self::THREE){ return$a; } } echo(newC)->f()."\n"; echoC::SENTENCE; ?>
以上例程会输出:
4
ThevalueofTHREEis3
现在可以通过const关键字来定义类型为array的常量。
<?php constARR=['a','b']; echoARR[0]; ?>
以上例程会输出:
a
使用...运算符定义变长参数函数(PHP5>=5.6.0,PHP7)
现在可以不依赖func_get_args(),使用...运算符来实现变长参数函数。
<?php functionf($req,$opt=null,...$params){ //$params是一个包含了剩余参数的数组 printf('$req:%d;$opt:%d;numberofparams:%d'."\n", $req,$opt,count($params)); } f(1); f(1,2); f(1,2,3); f(1,2,3,4); f(1,2,3,4,5); ?>
以上例程会输出:
$req:1;$opt:0;numberofparams:0
$req:1;$opt:2;numberofparams:0
$req:1;$opt:2;numberofparams:1
$req:1;$opt:2;numberofparams:2
$req:1;$opt:2;numberofparams:3
使用...运算符进行参数展开(PHP5>=5.6.0,PHP7)
在调用函数的时候,使用...运算符,将数组和可遍历对象展开为函数参数。在其他编程语言,比如Ruby中,这被称为连接运算符,。
<?php functionadd($a,$b,$c){ return$a+$b+$c; } $operators=[2,3]; echoadd(1,...$operators); ?>
以上例程会输出:
6
usefunction以及useconst(PHP5>=5.6.0,PHP7)
use运算符被进行了扩展以支持在类中导入外部的函数和常量。对应的结构为usefunction和useconst。
<?php namespaceName\Space{ constFOO=42; functionf(){echo__FUNCTION__."\n";} } namespace{ useconstName\Space\FOO; usefunctionName\Space\f; echoFOO."\n"; f(); } ?>
以上例程会输出:
42
Name\Space\f
__debugInfo()(PHP5>=5.6.0,PHP7)
加入__debugInfo(),当使用var_dump()输出对象的时候,可以用来控制要输出的属性和值。
<?php classC{ private$prop; publicfunction__construct($val){ $this->prop=$val; } publicfunction__debugInfo(){ return[ 'propSquared'=>$this->prop**2, ]; } } var_dump(newC(42)); ?>
以上例程会输出:
object(C)#1(1){ ["propSquared"]=> int(1764) }
标量类型声明(PHP7)
标量类型声明有两种模式:强制(默认)和严格模式。现在可以使用下列类型参数(无论用强制模式还是严格模式):字符串(string),整数(int),浮点数(float),以及布尔值(bool)。它们扩充了PHP5中引入的其他类型:类名,接口,数组和回调类型。
<?php //Coercivemode functionsumOfInts(int...$ints) { returnarray_sum($ints); } var_dump(sumOfInts(2,'3',4.1));
以上例程会输出:
int(9)
要使用严格模式,一个declare声明指令必须放在文件的顶部。这意味着严格声明标量是基于文件可配的。这个指令不仅影响参数的类型声明,也影响到函数的返回值声明(参见返回值类型声明,内置的PHP函数以及扩展中加载的PHP函数)
返回值类型声明(PHP7)
PHP7增加了对返回类型声明的支持。类似于参数类型声明,返回类型声明指明了函数返回值的类型。可用的类型与参数声明中可用的类型相同。
<?php functionarraysSum(array...$arrays):array { returnarray_map(function(array$array):int{ returnarray_sum($array); },$arrays); } print_r(arraysSum([1,2,3],[4,5,6],[7,8,9]));
以上例程会输出:
Array
(
[0]=>6
[1]=>15
[2]=>24
)
null合并运算符(PHP7)
由于日常使用中存在大量同时使用三元表达式和isset()的情况,我们添加了null合并运算符(??)这个语法糖。如果变量存在且值不为NULL,它就会返回自身的值,否则返回它的第二个操作数。
<?php //Fetchesthevalueof$_GET['user']andreturns'nobody' //ifitdoesnotexist. $username=$_GET['user']??'nobody'; //Thisisequivalentto: $username=isset($_GET['user'])?$_GET['user']:'nobody'; //Coalescescanbechained:thiswillreturnthefirst //definedvalueoutof$_GET['user'],$_POST['user'],and //'nobody'. $username=$_GET['user']??$_POST['user']??'nobody'; ?>
太空船操作符(组合比较符)(PHP7)
太空船操作符用于比较两个表达式。当$a小于、等于或大于$b时它分别返回-1、0或1。比较的原则是沿用PHP的常规比较规则进行的。
<?php //Integers echo1<=>1;//0 echo1<=>2;//-1 echo2<=>1;//1 //Floats echo1.5<=>1.5;//0 echo1.5<=>2.5;//-1 echo2.5<=>1.5;//1 //Strings echo"a"<=>"a";//0 echo"a"<=>"b";//-1 echo"b"<=>"a";//1 ?>
通过define()定义常量数组(PHP7)
Array类型的常量现在可以通过define()来定义。在PHP5.6中仅能通过const定义。
<?php define('ANIMALS',[ 'dog', 'cat', 'bird' ]); echoANIMALS[1];//outputs"cat" ?>
匿名类(PHP7)
现在支持通过newclass来实例化一个匿名类,这可以用来替代一些“用后即焚”的完整类定义。
<?php interfaceLogger{ publicfunctionlog(string$msg); } classApplication{ private$logger; publicfunctiongetLogger():Logger{ return$this->logger; } publicfunctionsetLogger(Logger$logger){ $this->logger=$logger; } } $app=newApplication; $app->setLogger(newclassimplementsLogger{ publicfunctionlog(string$msg){ echo$msg; } }); var_dump($app->getLogger()); ?>
以上例程会输出:
object(class@anonymous)#2(0){
}
Closure::call()(PHP7)
Closure::call()现在有着更好的性能,简短干练的暂时绑定一个方法到对象上闭包并调用它。
<?php classA{private$x=1;} //PrePHP7code $getXCB=function(){return$this->x;}; $getX=$getXCB->bindTo(newA,'A');//intermediateclosure echo$getX(); //PHP7+code $getX=function(){return$this->x;}; echo$getX->call(newA);
以上例程会输出:
1
1
为unserialize()提供过滤(PHP7)
这个特性旨在提供更安全的方式解包不可靠的数据。它通过白名单的方式来防止潜在的代码注入。
<?php //convertsallobjectsinto__PHP_Incomplete_Classobject $data=unserialize($foo,["allowed_classes"=>false]); //convertsallobjectsinto__PHP_Incomplete_ClassobjectexceptthoseofMyClassandMyClass2 $data=unserialize($foo,["allowed_classes"=>["MyClass","MyClass2"]); //defaultbehaviour(sameasomittingthesecondargument)thatacceptsallclasses $data=unserialize($foo,["allowed_classes"=>true]);
Groupusedeclarations(PHP7)
从同一namespace导入的类、函数和常量现在可以通过单个use语句一次性导入了。
<?php //PrePHP7code usesome\namespace\ClassA; usesome\namespace\ClassB; usesome\namespace\ClassCasC; usefunctionsome\namespace\fn_a; usefunctionsome\namespace\fn_b; usefunctionsome\namespace\fn_c; useconstsome\namespace\ConstA; useconstsome\namespace\ConstB; useconstsome\namespace\ConstC; //PHP7+code usesome\namespace\{ClassA,ClassB,ClassCasC}; usefunctionsome\namespace\{fn_a,fn_b,fn_c}; useconstsome\namespace\{ConstA,ConstB,ConstC}; ?>
先总结这些,内容都是来自php的文档,之后有用到这里略过的新特性也会补充过来~~
以上就是对PHP新特性的资料整理,后续继续补充相关资料,谢谢大家对本站的支持!