1.null兼并运算符(??)
??语法: 假如变量存在且值不为NULL,它就会返回本身的值,不然返回它的第二个操作数.
//php7之前 if推断 if(empty($_GET['param'])) { $param = 1; }else{ $param = $_GET['param']; } //php7之前 三元运算符 $param = empty($_GET['param']) ? 1 : $_GET['param']; //PHP7 null兼并运算符 $param = $_GET['param'] ?? 1;//1
2. define() 定义常量数组
//php7之前 define("CONTENT", "hello world"); echo CONTENT;//hello world //PHP7 define('ANIMALS', [ 'dog', 'cat', 'bird' ]); echo ANIMALS[2];//bird //PHP7 类外也可运用const来定义常量 const CONSTANT = 'Hello World'; echo CONSTANT;//Hello World
3. 组合比较符(<=>)
组合比较符用于比较两个表达式.当b时它离别返回-1、0或1. 比较的原则是相沿PHP的通例比较划定规矩举行的.
//整数 echo 1 <=> 1; // 0 echo 1 <=> 2; // -1 echo 2 <=> 1; // 1 //浮点数 echo 1.5 <=> 1.5; // 0 echo 1.5 <=> 2.5; // -1 echo 2.5 <=> 1.5; // 1 //字符串 echo "a" <=> "a"; // 0 echo "a" <=> "b"; // -1 echo "b" <=> "a"; // 1
4. 变量范例声明
两种形式: 强迫(默许)和严厉形式. 能够运用以下范例参数: string,int,float,bool
//... 操作符: 示意这是一个可变参数. php5.6及以上的版本可运用: 函数定义的时刻变量前运用. function intSum(int ...$ints){ return array_sum($ints); } var_dump(intSum(2,'3.5'));//5 //严厉形式 //形式声明:declare(strict_types=1); 默许状况值为0,值为1代表为严厉校验的形式 declare(strict_types=1); function add(int $a,int $b){ return $a+$b; } var_dump(add(2,'3.5')); //Fatal error: Uncaught TypeError: Argument 2 passed to add() must be of the type integer
5. 返回值范例声明
增添返回范例声明的支撑.类似于参数范例声明.(用法在函数定义的背面加 :范例名)
//有用的返回范例 declare(strict_types = 1); function getInt(int $value): int { return $value; } print(getInt(6));//6
//无效返回范例 declare(strict_types = 1); function getNoInt(int $value): int { return $value+'2.5'; } print(getNoInt(6));//Fatal error: Uncaught TypeError: Return value of getNoInt() must be of the type integer
6. 匿名类
许可new class {} 建立一个匿名的对象.
<?php //php7之前 接口完成 interface User{ public function getDiscount(); } class VipUser implements User{ //折扣系数 private $discount = 0.6; public function getDiscount() { return $this->discount; } } class Goods{ private $price = 200; private $objectVipUser; //User接口VipUser类完成 public function getUserData(User $User){ $this->objectVipUser = $User; $discount = $this->objectVipUser->getDiscount(); echo "商品价格:".$this->price*$discount; } } $display = new Goods(); //通例实例化接口完成对象 $display->getUserData(new VipUser);//商品价格:120
<?php //php7 建立一个匿名的对象 interface User{ public function getDiscount(); } class Goods{ private $price = 200; private $objectVipUser; public function getUserData($User){ $this->objectVipUser = $User; $discount = $this->objectVipUser->getDiscount(); echo "商品价格:".$this->price*$discount; } } $display = new Goods(); //new匿名对象完成user接口 $display->getUserData(new class implements User{ private $discount = 0.6; public function getDiscount() { return $this->discount; } });//商品价格:120
7. Closure::call()
Closure::call() 要领被添加为一个简短的体式格局来暂时绑定一个对象作用域到一个闭包并挪用它. 与PHP5的bindTo比拟.它的机能要快很多.
<?php //php7之前 class A { private $attribute = 'hello world'; } $getClosure = function(){ return $this->attribute; }; $getAttribute = $getClosure->bindTo(new A, 'A');//中间层闭包 echo $getAttribute();//hello world
<?php //PHP7 class A { private $attribute = 'hello world'; } $getClosure = function(){ return $this->attribute; }; echo $getClosure->call(new A);//hello world
8. unserialize()
unserialize()函数:过滤的特征,能够防备不法数据举行代码注入,供应了更平安的反序列化数据
<?php class A{ public $name = 'admin_a'; } class B{ public $name = 'admin_b'; } $objA = new A(); $objB = new B(); $serializedObjA = serialize($objA); $serializedObjB = serialize($objB); //默许行动是吸收一切类; 第二个参数能够疏忽 $dataA = unserialize($serializedObjA , ["allowed_classes" => true]); var_dump($dataA);//object(A)#3 (1) { ["name"]=> string(7) "admin_a" } //假如allowed_classes设置为false,unserialize会将一切对象转换为__PHP_Incomplete_Class对象 $dataA = unserialize($serializedObjA , ["allowed_classes" => false]); var_dump($dataA);//object(__PHP_Incomplete_Class)#4 (2) { ["__PHP_Incomplete_Class_Name"]=> string(1) "A" ["name"]=> string(7) "admin_a" } //转换一切对象到 __PHP_Incomplete_Class对象,除了对象"B" $dataB = unserialize($serializedObjB , ["allowed_classes" => ["B"]]); var_dump($dataB);//object(B)#3 (1) { ["name"]=> string(7) "admin_b" }
9. IntlChar
IntlChar:供应了一些可用于接见Unicode字符信息的有用要领的接见. 注重:必需装置Intl扩大才运用!
var_dump(IntlChar::CODEPOINT_MAX);//int(1114111) echo '<br>'; var_dump(IntlChar::charName('+'));//string(9) "PLUS SIGN" echo '<br>'; var_dump(IntlChar::ispunct('?'));//bool(true)
10. CSPRNG
CSPRNG 函数供应一种简朴的机制来生成暗码的随机数.
random_bytes() -加密生存被庇护的伪随机字符串.
random_int() -加密生存被庇护的伪随机整数.
$bytes = random_bytes(8); echo(bin2hex($bytes));//随机2073a110a2e3c497 echo '<br>'; echo(random_int(1, 999));//随机786 echo '<br>'; print(random_int(-999, -1));//随机-357
11. use 语句
能够运用单个use语句从雷同的定名空间导入类,函数和常量,而不是运用多个use语句.
//PHP7之前 use some\namespace\ClassA; use some\namespace\ClassB; use some\namespace\ClassC as C; use function some\namespace\fn_a; use function some\namespace\fn_b; use function some\namespace\fn_c; use const some\namespace\ConstA; use const some\namespace\ConstB; use const some\namespace\ConstC; // PHP7以后 use some\namespace\{ClassA, ClassB, ClassC as C}; use function some\namespace\{fn_a, fn_b, fn_c}; use const some\namespace\{ConstA, ConstB, ConstC};
12. intdiv
新增添intdiv()函数,吸收两个参数,返回值为第一个参数除于第二个参数的值并取整.
echo intdiv(8,4);//2 echo intdiv(10,4);//2 echo intdiv(5,10);//0
13. PHP7 毛病处置惩罚
PHP7 改变了大多数毛病的报告体式格局.不同于PHP5的传统毛病报告机制,如今大多数毛病被作为Error非常抛出.
这类Error非常能够像一般非常一样被try / catch块所捕捉. 假如没有婚配的try / catch块,则挪用非常处置惩罚函数(由 set_exception_handler() 注册)举行处置惩罚.
假如还没有注册非常处置惩罚函数,则根据传统体式格局处置惩罚:被报告为一个致命毛病(Fatal Error).
Error类并非从Exception类扩大出来的,所以用catch (Exception $e) { ... } 如许的代码是捕捉不到Error的.你能够用 catch (Error $e) { ... } 如许的代码,
或许经由过程注册非常处置惩罚函数( set_exception_handler())来捕捉Error.
<?php //php7之前 自定义非常处置惩罚 class getException extends Exception{ public function errorMsg(){ return '毛病的信息'.$this->getMessage().'<br>毛病的代码'.$this->getCode(); } } try { $num =10; if($num > 1) { throw new getException($num,404); } } catch (getException $e) { echo $e->errorMsg(); }
<?php //php7 非常处置惩罚 try { test(); }catch(\Exception $e){ echo $e->getMessage();//自定义非常抛出 }catch(\Error $e) { //体系毛病 echo $e->getMessage();//Call to undefined function test() }
更多PHP相干学问,请接见ki4网!
以上就是php7新特征的比较和明白的细致内容,更多请关注ki4网别的相干文章!