当前位置: 首页 > 后端技术 > PHP

【现代PHP专题(一)】php7排序的共同特点

时间:2023-03-30 00:52:05 PHP

PHP7性能最大的亮点应该是性能提升了两倍,在某些测试环境下甚至提升了三到五倍。详情请参考以下链接:PHP7VSHHVM(WordPress)HHVMvsPHP7–TheCompetitionGetsCloser!PHP7.0比PHP5表现出非常有前途的性能,通过HHVMPHP7创新和性能优化缩小了差距共同特征标量类型声明PHP7中的函数参数类型声明可以是一个标量。在PHP5中,只能是类名、接口、数组或可调用对象(PHP5.4,可以是函数,包括匿名函数),现在也可以使用string、int、float和bool。string(1)"6"[1]=>string(2)"15"[2]=>string(2)"24"}//7.1字符串或空函数testReturn():?string{returnnull;}//7.1不返回或空返回。//NULL不是void的合法返回值。尽管它返回一个空函数swap(&$left,&$right):void{if($left===$right){return;}$tmp=$left;$左=$右;$right=$tmp;}$a=1;$b=2;var_dump(swap($a,$b),$a,$b);//7.1返回对象类型functiontest(object$obj):object{returnnewSplQueue();}//7.1//iterable:实现Traversable接口的数组或对象//Traversable是IteratorAggregate或Iterator接口的实现。//即函数必须传入一个foreach可以遍历的参数,返回一个foreach可以遍历的值functioniterator(iterable$iter):iterable{foreach($iteras$val){//}}还有严格模式和强制模式允许重写抽象方法(Abstractmethod)inheritance抽象类可以重写被继承的抽象类的抽象方法。abstractfunctiontest($s):int;}operator...5.6有这个特性,但是只在PHP7的程序代码中发现大量使用...运算符来定义变长参数函数functionf($req,$opt=null,...$params){//$params是一个包含剩余参数的数组printf('$req:%d;$opt:%d;参数数量:%d'."\n",$req,$opt,count($params));}f(1);f(1,2);f(1,2,3);f(1,2,3,4);#输出$请求:1;$选择:0;参数数量:0$req:1;$选择:2;参数数量:0$req:1;$选择:2;参数数量:1$req:1;$选择:2;参数数量:2使用...运算符进行参数扩展functionadd($a,$b,$c){return$a+$b+$c;}$operators=[2,3];echoadd(1,...$运营商);//输出:6NULL合并运算符//如果$_GET['user']不存在,则返回'nobody',否则返回$_GET['user']$username=$_GET['user']的值??'nobody';//等价于isset($_GET['user'])?$_GET['user']:'nobody';//类似屏蔽后提示错误:$username=$_GET['user']?:'nobody';飞船运算符(组合比较器)用于比较两个表达式。当$a大于、等于或小于$b时,它分别返回-1、0或1。1;//0回声1<=>2;//-1回声2<=>1;//1//浮点型echo1.5<=>1.5;//0echo1.5<=>2.5;//-1echo2.5<=>1.5;//1//字符串echo"a"<=>"a";//0echo"a"<=>"b";//-1echo"b"<=>"a";//1通过define()定义一个常量数组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){}为unserialize()提供过滤,这个特性旨在提供更多的安全性以防止通过白名单进行潜在代码注入的方式解压缩不可靠的数据。//将对象转换为__PHP_Incomplete_Class对象$data=unserialize($foo,["allowed_classes"=>false]);//将对象转换为__PHP_Incomplete_Class对象,MyClass和MyClass2除外$data=unserialize($foo,["allowed_classes"=>["MyClass","MyClass2"]]);//默认接受所有类$data=unserialize($foo,["allowed_classes"=>true]);断言assert向后使用并增强了以前的assert()方法。它以零成本在生产中启用断言,并提供在断言失败时抛出特定异常的能力。ini_set('assert.exception',1);classCustomErrorextendsAssertionError{}assert(2==1,newCustomError('Someerrormessage'));使用增强类,从同一个命名空间导入的函数和常量现在可以通过一次导入单个use语句。//在PHP7之前使用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+用法usesome\namespace\{ClassA,ClassB,ClassCasC};usefunctionsome\namespace\{fn_a,fn_b,fn_c};useconstsome\namespace\{ConstA,ConstB,ConstC};Generator增强:yieldfrom增强了Generator的功能,可以实现很多高级特性functiongen(){yield1;产量2;从gen2()产生;}functiongen2(){产生3;yield4;}foreach(gen()as$val){echo$val,PHP_EOL;}添加整数除法intdiv()var_dump(intdiv(10,3));#3array_column()和list()新支持对象数组list($a,$b)=(object)newArrayObject([0,1]);//PHP7结果:$a==0and$b==1.//PHP5结果:$a==null和$b==null。//短数组语法([])现在是list()语法的替代方法$data=[[1,'Tom'],[2,'Fred'],];//list()stylelist($id1,$name1)=$data[0];//[]样式[$id1,$name1]=$data[0];#$id1:1//7.1也支持键名["id"=>$id1,"name"=>$name1]=$data[0];dirname()添加可选的$levels,可用于指定目录级别dirname(dirname($foo))=>dirname($foo,2);Closure::call()Closure::call()现在有更好的性能,将方法临时绑定到闭包对象并调用它的简洁明了的方法。classA{private$x=1;}//PrePHP7code$getXCB=function(){return$this->x;};$getX=$getXCB->bindTo(newA,'A');echo$getX();////PHP7+代码$getX=function(){return$this->x;};echo$getX->call(newA);类常量可见性支持设置类常量的可见性。getMessage();}//只捕获错误catch(Error$e){echo'Error:'.$e->getMessage();}//只捕获异常catch(Exception$e){echo'Exception:'.$e->getMessage();}asynchronoussignalProcessing//开启异步信号处理pcntl_async_signals(true);//SIGINT信号是ctrl+c,当ctrl+c触发这个回调pcntl_signal(SIGINT,function(){echo'capturedSIGINT信号'.PHP_EOL;});$i=0;while(1){echo$i++.PHP_EOL;sleep(1);}更多信息请参考:关于PHP7新特性