php7新特性的理解和比較

2020-07-16 10:06:12
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. 組合比較符(<=>)

組合比較符用於比較兩個表示式.當$a小於、等於或大於$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){
          $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 somenamespaceClassA; 
use somenamespaceClassB; 
use somenamespaceClassC as C; 
use function somenamespacefn_a;
use function somenamespacefn_b; 
use function somenamespacefn_c; 
use const somenamespaceConstA; 
use const somenamespaceConstB;
use const somenamespaceConstC;
// PHP7之後
use somenamespace{ClassA, ClassB, ClassC as C};
use function somenamespace{fn_a, fn_b, fn_c};
use const somenamespace{ConstA, ConstB, ConstC};

12. intp

新增加intp()函數,接收兩個引數,返回值為第一個引數除於第二個引數的值並取整.


echo intp(8,4);//2
echo intp(10,4);//2
echo intp(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(Error $e) {
     echo $e->getMessage();//Call to undefined function test()
      }

相關推薦:《PHP教學

以上就是php7新特性的理解和比較的詳細內容,更多請關注TW511.COM其它相關文章!