也許你已經知道,重頭戲 PHP 7 的發佈將在今年到來!如今,讓咱們來了解一下,新版本有哪些新功能與改進。html
在本系列的 第一篇 ,咱們介紹了 PHP 7 中最重要的一些不兼容性修復以及兩大新特性。在本文中,咱們將瞭解 PHP 7 的另外六大功能。git
新增長的轉義字符—— \u,容許咱們在 PHP 字符串內明確指定 Unicode 字符代碼點(以十六進制):github
此處使用的語法爲 \u{CODEPOINT} 。例如這個綠色的心形,?, 能夠表示爲 PHP 字符串 __"\u{1F49A}"__。express
另外一個新的操做符—— 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; }
在每次迭代中,將輸出:
"Hello"
" "
"World!"
"Goodbye"
" "
"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 沙盒,開始運行你的測試套件,或執行常規的質量檢驗。向項目報告錯誤,並按期重試。
使用 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 應用內部完成應用性能管理和監控,包括代碼級別性能問題的可見性、性能瓶頸的快速識別與追溯、真實用戶體驗監控、服務器監控和端到端的應用性能管理。