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

2021-09-19 13:44:49 字數 3876 閱讀 2457

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

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

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

新增加的轉義字元—— \u,允許我們在 php 字串內明確指定 unicode 字元**點(以十六進製制):

此處使用的語法為\u。例如這個綠色的心形,?, 可以表示為 php 字串 __"\u"__。

另乙個新的操作符—— 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 

$closure = function($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\;

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

use framework\component\;
生成器返回表示式

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

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

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

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

舉例如下:

function gen() 

$gen = gen();

foreach ($gen as $value)

// outputs "hello" on iteration 1, " " on iterator 2, and "world!" on iteration 3

echo $gen->getreturn(); // goodbye moon!

生成器委託

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

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

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

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

function hello() 

function goodbye()

$gen = hello();

foreach ($gen as $value)

在每次迭代中,將輸出:

"hello"

"world!"

"goodbye"

"moon!"

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

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

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

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

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

此外, eval()』ed **中的解析錯誤會丟擲 \parseexception,而型別不匹配將丟擲乙個 \typeexception。

如下例:

try  catch (\engineexception $e) 

object(engineexception)#1 (7)

["previous":"baseexception":private]=>

null

}

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

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

測試你的**

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

幫助 gophp7-ext

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

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

書寫文件php 7 將是偉大的!

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

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

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

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

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

php7的新特性

截止到目前為止,php官方已經發布了php7的rc5版本,預計在11月份左右會發布第乙個正式版本!現在來說php7的重大特性肯定已經是定型了,不會再有什麼變動了。後續一些版本的迭代主要也就是修修bug,優化之類的。下面就來說話我們一直期待的php7.0新特徵吧。1.標量引數型別宣告 現在支援字串 s...

PHP7的新特性

php7 從發布到現在已經有快三年的時間了,現在已經發展到 php7.2.9 版本了。它的發布給 php 帶來了很大的效能提公升,這主要是得益於 php 對 zend 引擎的深度優化,同時還降低了 php 對系統的資源占用。主要的變化有以下幾點 在php之前的版本中,php 在語法解析階段直接生成了...

php7的新特性

php7新特性 太空船操作符 echo 1 1 0 echo 1 2 1 echo 2 1 1 型別宣告 declare strict types 1 strict types 1表示開啟嚴格模式 function sum int.ints int 3.null合併操作符 page 0 page?0...