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新特性的资料整理,后续继续补充相关资料,谢谢大家对本站的支持!