摘要:在本系列的第一篇我們介紹了中最重要的一些不兼容性修復以及兩大新特性。例如這個綠色的心形,,可以表示為字符串。雖然現在它只具備內部測試品質目前已可以下載,但的確讓人期待。向項目報告錯誤,并定期重試。
這是我們期待已久的 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 FrameworkComponentSubComponentClassA; use FrameworkComponentSubComponentClassB as ClassC; use FrameworkComponentOtherComponentClassD; // With Group Use use FrameworkComponent{ SubComponentClassA, SubComponentClassB as ClassC, OtherComponentClassD };
你也可以在常量導入與函數導入時與 use function、use const 一起使用它。同時也支持混合導入。
use FrameworkComponent{ SubComponentClassA, function OtherComponentsomeFunction, const OtherComponentSOME_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!
第二個功能則更令人興奮:生成器委托。這允許你返回另一個可迭代結構,它可以迭代自身——不論是數組,迭代器,還是另一個生成器。
重要的是,子結構的迭代是由最外層的原始循環完成的,如同單一的平面結構,而非遞歸結構。
當向生成器發送數據或異常時也同理。這些數據或異常會直接傳到子結構中,就像被調用直接控制。
這是使用了
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 應用內部完成應用性能管理和監控,包括代碼級別性能問題的可見性、性能瓶頸的快速識別與追溯、真實用戶體驗監控、服務器監控和端到端的應用性能管理。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/21226.html
摘要:然而,兩個重要的已經獲得通過,它們將帶來一些期望已久的內部與用戶層的一致性。綜合比較運算符我個人最喜歡的新增特性是綜合比較運算符,,也稱為飛船操作符。實際上,該操作符的工作方式與,或基本一致。 這是我們期待已久的 PHP 7 系列文章的第一篇。 或許你已經知道了,我在?PHP 5.0.0 時間軸?提的 RFC (Request For Comments)通過了, PHP 7 成為 PH...
摘要:在理想的情況下,我們甚至可以立即將應用程序升級到。于是,在中,我們可以得到些什么正如我們所看到的,的新增特性除之外并不是很亮眼,盡管這些特性非常好用,但對于大多數應用程序來說并不重要。 轉載請注明出處:葡萄城官網,葡萄城為開發者提供專業的開發工具、解決方案和服務,賦能開發者。 本文由葡萄城翻譯并發布 showImg(https://segmentfault.com/img/bVbrk...
摘要:的新特性說了這么多,看都會有哪些特性來改變我們寫代碼的方式呢局部變量類型推斷局部變量類型推斷可以說是中最值得注意的特性,這是語言開發人員為了簡化應用程序的編寫而采取的又一步,如下圖所示。 showImg(https://segmentfault.com/img/remote/1460000015356980); Java 9才發布幾個月,很多玩意都沒整明白,現在Java 10又快要來了...
摘要:物聯網已經成為現實只要去年單獨參加過會議或者搜索過專門的技術網站,你現在會越來越清楚地注意到物物互聯正在蓬勃發展。有大量的討論在口頭上承認了物聯網,年這方面的激烈討論只會更多。兩年過去了,期待已久的更新應該在月日發布。 導讀 如果你還在為Oracle收購Sun公司給Java社區的變化所糾結,請站在Oracle的角度替它想想吧。2013年大部分時間里,Oracle都在與遺留的Java安...
閱讀 533·2023-04-26 01:39
閱讀 4485·2021-11-16 11:45
閱讀 2609·2021-09-27 13:37
閱讀 882·2021-09-01 10:50
閱讀 3579·2021-08-16 10:50
閱讀 2217·2019-08-30 15:55
閱讀 2979·2019-08-30 15:55
閱讀 2259·2019-08-30 14:07