PHP7.0 的新特性

簡介:PHP7.0 的新特性常常會被面試官問到,在平時的項目開發中運用它們也會提高必定的代碼質量和代碼運行性能,可見這個知識點的重要性。不過有不少人都沒有去系統的瞭解掌握,今天我恰好系統整理了一番分享出來。php

圖片版

PHP7.0 的新特性

文字版

1. 新增了標量類型聲明和函數的返回值類型聲明
例如:
<?php declare(strict_types=1)//1:嚴格模式 0:強制模式(默認)
class OrderService extends BaseService
{
   ...
     /**
     * 全部訂單詳情都是經過這個入口
     * @param $orderNo
     * @return array|mixed
     * @throws Exception
     */
     public function getOrderDetailByOrderNo(string $orderNo) : array
    {
      $order = $this->model->getByFields(['order_no' => $orderNo]);

      if (empty($order)) {
      return [];
      }
      return (new OrderFactory)->getOrder($order['order_type'])->getOrderDetailByOrderNo($orderNo);
    }
}

2. 太空船運算符(組合比較符):<=>
例如:
$c = $a <=> $b
若 $a>$b,則 $c=1
若 $a=$b,則 $c=0
若 $a<$b,則 $c=-1

3. NULL合併運算:??
PHP7 以前:$c = isset($b)?$b:0;
PHP7+ :$c = $b??0;

4. 定義常量數組:define("ARR",[1,2,3])

5. 新增抽象語法樹AST(高度解耦)
PHP7 以前:PHP 代碼 -> Parser 語法解析 -> OPCODE -> 執行
PHP7+ :PHP 代碼 -> Parser 語法解析 -> AST -> OPCODE -> 執行

6. 命名空間引用優化
PHP7 以前:
use FooLibrary\Bar\Baz\ClassA; 
use FooLibrary\Bar\Baz\ClassB; 
PHP7+:
use FooLibrary\Bar\Baz\{ ClassA, ClassB};

7. 反序列化函數Unserialize()提供更安全的過濾特性

8. 新增整除函數intdiv()
例如:intdiv(10,3)
結果:3

9. 錯誤處理更友好
* 在PHP7+ 中,不少致命錯誤以及可恢復的致命錯誤,都被轉換爲異常來處理了。 這些異常繼承自 Error 類,此類實現了 Throwable 接口 (全部異常都實現了這個基礎接口)
* PHP7+ 進一步方便開發者處理, 讓開發者對程序的掌控能力更強. 由於在默認狀況下, Error會直接致使程序中斷, 而PHP7+ 則提供捕獲而且處理的能力, 讓程序繼續執行下去, 爲程序員提供更靈活的選擇

10. 新增匿名類
經過 new class 來實例化一個匿名類,能夠用來替代一些"用後即焚"的完整類定義
例如:
<?php
interface Logger {
   public function log(string $msg);
}
class Application {
   private $logger;
   public function getLogger(): Logger {
      return $this->logger;
   }
   public function setLogger(Logger $logger) {
      $this->logger = $logger;
   }  
}
$app = new Application;
// 使用 new class 建立匿名類
$app->setLogger(new class implements Logger {
   public function log(string $msg) {
      print($msg);
   }
});
$app->getLogger()->log("個人第一條日誌");
結果:個人第一條日誌

11. 新增兩個更安全的僞隨機生成器函數random_bytes()和random_int()

12. Closure::call()
有着更好的性能,將一個閉包函數動態綁定到一個新的對象實例並調用執行該函數
例如:
<?php
class A {
    private $x = 1;
}
// PHP 7 以前版本定義閉包函數代碼
$getXCB = function() {
    return $this->x;
};
// 閉包函數綁定到類 A 上
$getX = $getXCB->bindTo(new A, 'A'); 
echo $getX();

// PHP 7+ 代碼
$getX = function() {
    return $this->x;
};
echo $getX->call(new A);

13. 移除擴展:ereg、mssql、mysql

閱讀原文獲取更多PHP內容: https://developer.aliyun.com/...mysql

相關文章
相關標籤/搜索