高性能 PHP7 * 新特性

PHP7 具有很多用於編寫高性能、高效代碼的新特性,同時也剔除了一些歷史版本中過時的特性。

類型聲明

默認情況下,所有的PHP文件都處於弱類型校驗模式。

<?php
// 1:默認值,表示嚴格類型校驗模式,不符則拋 Fatal error
// 0:表示弱類型校驗模式。
declare(strict_types=1);

// 規定形參、返回值類型
function sum(int ...$ints):int
{
    return array_sum($ints);
}

print(sum(1,2,3));

存在意義:聲明類型之後,使得函數、方法的形參與返回值有所預期,並且省去了對數據類型的檢測,提高執行效率。

use 關鍵字批量聲明

PHP 7 可以使用一個 use 從同一個 namespace 中導入類、函數和常量:

// PHP 7 之前版本需要使用多次 use
use some\namespace\ClassA;
use some\namespace\ClassB;
use function some\namespace\fn_a;
use const some\namespace\ConstA;

// PHP 7+ 之後版本可以使用一個 use 導入同一個 namespace 的類
use some\namespace\{ClassA
    , ClassB as B
    , function fn_a
    , const ConstA
};

存在意義:提高了代碼可讀性。

匿名類

匿名類可以用來替代一些"用後即焚"的完整類定義,雖然匿名類沒有命名,但在內存的引用地址表中爲其分配一個全局唯一的名稱。

$name = new class(){
    public function __construct()
    {
        // class@anonymous/Users/atong/htdocs/test.php0x104601063
        echo get_class();
    }
};

存在意義:匿名類的一次性任務代碼流程對性能提升幫助很大(高性能PHP7 p28)。

不推薦使用老式構造方法

老式的構造函數在PHP7中依然可用,但會產生不被推薦的信息,並且使用 __construct 時,老式的構造函數失效。

class Atong {
    public function Atong(){
        echo "function atong is called";
    }

    public function __construct(){
        echo "function __construct is called";
    }
}

$atong = new Atong();
// function __construct is called

存在意義:統一和規範。

5 Throwable 接口

在PHP 7之前異常可以被截獲,但是錯誤不能被截獲。從PHP 7之後,任何完整程序或者一部分中的Fatal錯誤可以被截獲。

try {
    $value = 1 % 0;
} catch (\DivisionByZeroError $e) {
    // TODO::記錄日誌
}

echo "it's still running .. ";

存在意義:更合理的異常處理。

太空飛船操作符(<=>)

太空船運算符(組合比較符)在比較變量時非常有用。

// 左大於右時:1
echo (1 <=> 0);
// 兩邊相等時:0
echo (1 <=> 1);
// 右大於左時:-1
echo (1 <=> 2);

存在意義:更少的代碼實現更多的事。

null 合併運算符(??)

空合併運算符可以用來取代三元運算與 isset () 函數。

if(isset($_GET["a"]))
    $a = $_GET["a"];
else
    $a = "test";

// 等效
$a = isset($_GET["a"]) ? $_GET["a"] : "test";

// 等效
$a = $_GET['a'] ?? "test";

存在意義:和 ?: 一樣,代碼更精簡。

統一變量語法

$first = ["name" => "second"];
$second = "atong";

// Notice ..
echo $$first["name"];

// atong,php7要求的語法規範
echo ${$first["name"]};

存在意義:規範。

常量數組

// php5.6 開始可以使用 const 關鍵字聲明數組常量
const STORES = ['en','fr','ar'];

// php7 常量數組可以通過 define 函數聲明
define("STORES",['en','fr','ar']);

Switch 中的多個默認值

PHP7 之前,多個 default 默認值在 switch語句中是被允許的,PHP7開始,這樣的代碼會產生 Fatal 級別錯誤。

存在意義:規範。

Session_start 函數中的選項數組

PHP7 之前,session_start() 函數沒有參數需要傳遞,session 的配置都在 php.ini 中,PHP 7 之後 session_start() 函數可以接收一個數組作爲參數,可以覆蓋php.ini中session的配置項。

session_start([
   'cache_limiter' => 'private',
   'read_and_close' => true,
]);

Unserialize 函數引入過濾器

通常使用serialize和unserialize兩個方法分別對對象進行序列化和反序列化。然而,unserialize()函數並不安全,因爲沒有任何過濾項,並且可以反序列化任何類型的對象。因此PHP 7引入過濾器,默認情況下允許反序列化所有類型的對象。使用方法如下:

$result = unserilize($object, ['allowed_classes' => ['Packt', 'Books', 'Ebooks']]);

參考:《高性能PHP7,Learning PHP7 High Performance》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章