PHP 7 值得期待的新特性(下)

OneAPM官方技術部落格發表於2015-11-16

這是我們期待已久的 PHP 7 系列文章的第二篇。點此閱讀 第一篇本文系 OneAPM 工程師編譯整理。

也許你已經知道,重頭戲 PHP 7 的釋出將在今年到來!現在,讓我們來了解一下,新版本有哪些新功能與改進。

在本系列的 第一篇 ,我們介紹了 PHP 7 中最重要的一些不相容性修復以及兩大新特性。在本文中,我們將瞭解 PHP 7 的另外六大功能。

Unicode 程式碼點轉義語法

新增加的轉義字元—— \u,允許我們在 PHP 字串內明確指定 Unicode 字元程式碼點(以十六進位制):

此處使用的語法為 \u{CODEPOINT} 。例如這個綠色的心形,?, 可以表示為 PHP 字串 "\u{1F49A}"

Null 合併操作符

另一個新的操作符—— Null 合併操作符 ?? ,其實是傳說中的三目運算子 。如果它不是 Null ,將返回左運算元,否則返回右運算元。

重點在於,如果左運算元是一個不存在的變數,也不會引起注意。這就像 isset() ,而不像 ?: 短三目運算子。

你還可以連結該操作符,從而返回給定集合的第一個非 null 值。

$config = $config ?? $this->config ?? static::$defaultConfig;

呼叫之上繫結閉包

之前,在 PHP 5.4 新增的 Closure->bindTo() 與 Closure::bind() 允許你改變 $this 和呼叫範圍的繫結,同時或單獨地,建立一個重複閉包。

現在,PHP 7 增加了在呼叫時達到上述功能的簡便方法,通過 Closure->call() 將 $this 和呼叫範圍繫結至同一物件 。該方法將物件作為首個引數,然後是傳到閉包中的其他引數,如下:

class HelloWorld {
     private $greeting = "Hello";
}

$closure = function($whom) { echo $this->greeting . ' ' . $whom; }

$obj = new HelloWorld();
$closure->call($obj, 'World'); // Hello World

組使用宣告

如果你曾經從同一名稱空間匯入多個類,而你的 IDE 能自動完成,你肯定會很高興。對於其他人,為了簡便起見,PHP 7 現在有了 組使用宣告。這讓你快速清楚地指定多次相似的 匯入:

// Original
use Framework\Component\SubComponent\ClassA;
use Framework\Component\SubComponent\ClassB as ClassC;
use Framework\Component\OtherComponent\ClassD;

// With Group Use
use Framework\Component\{
     SubComponent\ClassA,
     SubComponent\ClassB as ClassC,
     OtherComponent\ClassD
};

你也可以在常量匯入與函式匯入時與 use function、use const 一起使用它。同時也支援混合匯入。

use Framework\Component\{
     SubComponent\ClassA,
     function OtherComponent\someFunction,
     const OtherComponent\SOME_CONSTANT
};

生成器改進

生成器返回表示式

生成器有兩大新功能。首先是 生成器返回表示式,它允許你在生成器(成功)完成時返回一個值。

PHP 7 之前,如果你嘗試返回任何值將導致錯誤。然而,現在你可以呼叫 $generator->getReturn() 來獲取返回值。

如果生成器尚未返回,或丟擲未捕獲的異常,呼叫 $generator->getReturn() 將丟擲一個異常。

如果生成器已完成,但沒有返回,則返回空。

舉例如下:

function gen() {
    yield "Hello";
    yield " ";
    yield "World!";

    return "Goodbye Moon!";
}

$gen = gen();

foreach ($gen as $value) {
    echo $value; 
}

// Outputs "Hello" on iteration 1, " " on iterator 2, and "World!" on iteration 3

echo $gen->getReturn(); // Goodbye Moon!
生成器委託

第二個功能則更令人興奮:生成器委託。這允許你返回另一個可迭代結構,它可以迭代自身——不論是陣列,迭代器,還是另一個生成器。

重要的是,子結構的迭代是由最外層的原始迴圈完成的,如同單一的平面結構,而非遞迴結構。

當向生成器傳送資料或異常時也同理。這些資料或異常會直接傳到子結構中,就像被呼叫直接控制。

這是使用了 <expression> 語法的 yield ,像這樣:

function hello() {
     yield "Hello";
     yield " ";
     yield "World!";

     yield from goodbye();
}

function goodbye() {
     yield "Goodbye";
     yield " ";
     yield "Moon!";
}

$gen = hello();
foreach ($gen as $value) {
     echo $value;
}

在每次迭代中,將輸出:

  1. "Hello"

  2. " "

  3. "World!"

  4. "Goodbye"

  5. " "

  6. "Moon!"

值得一提的一點警告是,由於子結構可以產生自己的鍵,多次迭代完全可能返回相同的鍵——如果這對你很重要,你需要自己想辦法避免。

內部異常

在 PHP 中,致命和可捕獲的致命錯誤一直無法處理,或者很難處理 。但有了內部異常 以後,許多這類錯誤現在都可以丟擲異常了。

現在,當一個致命或可捕獲的致命錯誤發生時,會丟擲一個異常,允許你從容地處理它。如果你不進行處理,它將成為未捕獲的異常這類傳統的致命錯誤。

這些異常是 \EngineException 物件。它們不像所有的使用者異常,並不繼承自 \Exception 類。這是為了確保現在捕獲 \Exception 類的程式碼今後不會開始捕獲致命錯誤。從而保持向後相容性。

在將來,如果你想同時捕獲傳統異常和內部異常,你需要捕獲他們新的共享父類,\BaseException。

此外, eval()’ed 程式碼中的解析錯誤會丟擲 \ParseException,而型別不匹配將丟擲一個 \TypeException。

如下例:

try {
    nonExistentFunction();
} catch (\EngineException $e) {
     var_dump($e);
}

object(EngineException)#1 (7) {
  ["message":protected]=>
  string(32) "Call to undefined function nonExistantFunction()"
  ["string":"BaseException":private]=>
  string(0) ""
  ["code":protected]=>
  int(1)
  ["file":protected]=>
  string(17) "engine-exceptions.php"
  ["line":protected]=>
  int(1)
  ["trace":"BaseException":private]=>
  array(0) {
  }
  ["previous":"BaseException":private]=>
  NULL
}

OneAPM for PHP 能夠深入到所有 PHP 應用內部完成應用效能管理 能夠深入到所有 PHP 應用內部完成應用效能管理和監控,包括程式碼級別效能問題的可見性、效能瓶頸的快速識別與追溯、真實使用者體驗監控、伺服器監控和端到端的應用效能管理。

即將到來!

距離 PHP 7.0.0 釋出只有八個月了(譯者翻譯時所剩時日不多),該版本很可能是 PHP 歷史上效能最快的一版。雖然現在它只具備內部測試品質(目前 RC5 已可以下載) ,但 PHP 7 的確讓人期待。

並且,你能幫助它變得更好。

測試你的程式碼

使用 Rasmus’s 的 PHP 7 vagrant 沙盒,開始執行你的測試套件,或執行常規的質量檢驗。向專案報告錯誤,並定期重試。

幫助 GOPHP7-EXT

使用 PHP 7 的一大障礙是確保更新所有擴充套件使之與新的 Zend Engine 3 相容。

如果你使用的擴充套件較為小眾,沒有得到其維護者足夠的關注——或者你使用自己的擴充套件——請檢視 GoPHP7-ext 專案從而確保 PHP 7 釋出後一切都準備妥當。

書寫文件

PHP 7 中的每個新功能都有一個 RFC 。你可以在 PHP.net 維基 找到他們,並在此基礎上寫新文件。你可以在 線上GUI 環境下 寫,包括提交(如果你有 karma)或提交補丁以供稽核。

總結

PHP 7 將是偉大的!

PHP是全世界最好的語言,沒有之一 :)

抓緊測試你的應用程式。幫助遷移擴充套件。

P.S. 你已經在使用 PHP 7 了麼?你對新功能有何感受?是否有你不滿意,或者不喜歡的地方?你認為你會何時升級?讓我們知道你的想法!

分享你的想法,盡在 APM俱樂部

OneAPM for PHP 能夠深入到所有 PHP 應用內部完成應用效能管理 能夠深入到所有 PHP 應用內部完成應用效能管理和監控,包括程式碼級別效能問題的可見性、效能瓶頸的快速識別與追溯、真實使用者體驗監控、伺服器監控和端到端的應用效能管理。

相關文章