PHP 7 值得期待的新特性(下)
也許你已經知道,重頭戲 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;
}
在每次迭代中,將輸出:
"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 沙盒,開始執行你的測試套件,或執行常規的質量檢驗。向專案報告錯誤,並定期重試。
幫助 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 應用內部完成應用效能管理和監控,包括程式碼級別效能問題的可見性、效能瓶頸的快速識別與追溯、真實使用者體驗監控、伺服器監控和端到端的應用效能管理。
相關文章
- PHP 7 值得期待的新特性(上)PHP
- PHP 8 有哪些值得期待的新特性PHP
- php7的新特性PHP
- HTTP/2有哪些值得期待的特性HTTP
- PHP7 新特性PHP
- php7新特性PHP
- PHP 7 的幾個新特性PHP
- 值得期待的NoSQL新書《Seven Databases in Seven Weeks》SQL新書Database
- 在能源轉型的背景下,這種化學品的新應用值得期待!
- VUE 3.0 學習探索入門系列 - Vue3.x 令人期待的新特性(7)Vue
- PHP 7 的 5 大新特性PHP
- PHP7.0 的新特性PHP
- PHP 7.4 新特性PHP
- 2012值得期待的圖靈新書(登船必備)圖靈新書
- .NET 7新特性
- PHP開發者應該學習、會用10個PHP7新特性PHP
- 帶你瞭解PHP7裡生成器的新特性PHP
- 2012值得期待的圖靈新書(如果不用上船)圖靈新書
- php7.3新特性PHP
- php8新特性PHP
- 低碳投資是否值得期待?
- PHP7 中我們應該學習會用的新特性PHP
- IIS 7新特性2
- IIS 7新特性4
- IIS 7新特性5
- 總結PHP 7新增加的特性PHP
- 2017 年最值得期待的 5 個新 Linux 發行版Linux
- Java 11 的新特性(下)Java
- PHP 5.3、5.4、5.5、5.6 中的新特性(7出來但是一樣有用)PHP
- 如何給 PHP 新增新特性PHP
- 令人期待的 PHP7.4PHP
- java-jdk7新特性JavaJDK
- 【巴喬】IIS 7新特性6
- PHP5.5 ~ PHP7.2 新特性整理PHP
- PHP 7.4 新特性 —— 預載入PHP
- PHP8 新特性實踐PHP
- WebSphere Integration Developer Version 7 中的新特性WebDeveloper
- 溫故而知新,重溫 Java 7 的那些“新”特性Java