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

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

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

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

Unicode 代碼點轉義語法

新增長的轉義字符—— \u,容許咱們在 PHP 字符串內明確指定 Unicode 字符代碼點(以十六進制):github

此處使用的語法爲 \u{CODEPOINT} 。例如這個綠色的心形,?, 能夠表示爲 PHP 字符串 __"\u{1F49A}"__。express

Null 合併操做符

另外一個新的操做符—— Null 合併操做符 ?? ,實際上是傳說中的三目運算符 。若是它不是 Null ,將返回左操做數,不然返回右操做數。數組

重點在於,若是左操做數是一個不存在的變量,也不會引發注意。這就像 isset() ,而不像 ?: 短三目運算符。服務器

你還能夠連接該操做符,從而返回給定集合的第一個非 null 值。php7

$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 應用內部完成應用性能管理和監控,包括代碼級別性能問題的可見性、性能瓶頸的快速識別與追溯、真實用戶體驗監控、服務器監控和端到端的應用性能管理。

相關文章
相關標籤/搜索