搜尋
首頁後端開發PHP7php7新特性的理解與比較

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 = &#39;hello world&#39;; 
  } 
   
  $getClosure = function(){ 
      return $this->attribute; 
  };
  
  $getAttribute = $getClosure->bindTo(new A, 'A');//中间层闭包
  echo $getAttribute();//hello world


  <?php  
  //PHP7 
  class A { 
      private  $attribute = &#39;hello world&#39;; 
  } 
   
  $getClosure = function(){ 
      return $this->attribute; 
  };
  
  echo $getClosure->call(new A);//hello world

 8. unserialize()

#unserialize()函數:過濾的特性,可以防止非法資料進行程式碼注入,提供了更安全的反序列化資料


##

  <?php  
  class A{  
     public $name = &#39;admin_a&#39;;    
  } 
  class B{ 
     public $name = &#39;admin_b&#39;; 
  } 
  $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. 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 &#39;错误的信息&#39;.$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新特性的理解與比較的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:cnblogs。如有侵權,請聯絡admin@php.cn刪除

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
3 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器