摘要:然而,兩個(gè)重要的已經(jīng)獲得通過,它們將帶來一些期望已久的內(nèi)部與用戶層的一致性。綜合比較運(yùn)算符我個(gè)人最喜歡的新增特性是綜合比較運(yùn)算符,,也稱為飛船操作符。實(shí)際上,該操作符的工作方式與,或基本一致。
這是我們期待已久的 PHP 7 系列文章的第一篇。
或許你已經(jīng)知道了,我在?PHP 5.0.0 時(shí)間軸?提的 RFC (Request For Comments)通過了, PHP 7 成為 PHP 下一個(gè)主要版本的名稱。
無論你對(duì)此話題有任何感想,PHP 7 是一個(gè)大事件,而且它將在今年發(fā)布!?PHP 7.0 時(shí)間軸?的 RFC 幾乎全票通過(32 對(duì) 2 )后,所有功能現(xiàn)在已經(jīng)確立了,我們將在六月中旬看到首個(gè)候選版本( RC )發(fā)布。
但這對(duì)你意味著什么呢?我們看到 5.x 新版本發(fā)布后,許多 Web 主機(jī)都不愿升級(jí)。一個(gè)重要的新版本發(fā)布難道不會(huì)帶來巨大的向后兼容隔斷,使得升級(jí)更加緩慢么?
答案是:視情況而定。請繼續(xù)往下讀。
在新版本中,許多語言邊界情況已經(jīng)得到處理。此外,性能與不一致性修復(fù)也是該版重點(diǎn)關(guān)注的問題。
接下來是細(xì)節(jié)討論。
不兼容性修復(fù)不幸的是,needle/haystack 問題還未得到修復(fù)。然而,兩個(gè)重要的 RFC 已經(jīng)獲得通過,它們將帶來一些期望已久的內(nèi)部與用戶層的一致性。
最大的(也是最難以察覺的)變化是新增的一種?抽象語法樹( AST )——代碼在編譯過程中的中間表示。有了這種表示,我們可以清理一些邊緣情況的不一致,并為將來開發(fā)一些極好的工具做好準(zhǔn)備,比如使用 AST 生成性能更好的 OpCode。
其次,統(tǒng)一變量語法?的引入,可能會(huì)導(dǎo)致更多問題。這解決了表達(dá)式求值中的許多不兼容問題。例如,可以使用 ($object->closureProperty)() 調(diào)用分配給屬性的閉包函數(shù) ,以及執(zhí)行鏈靜態(tài)調(diào)用,如下所示:
????class foo { static $bar = "baz"; } ????class baz { static $bat = "Hello World"; } ????baz::$bat = function () { echo "Hello World"; }; ????$foo = "foo"; ????($foo::$bar::$bat)();
然而,一些語法也在改變。特別是使用 variable->variables/properties 的語法。
在 PHP 7 之前,$obj->$properties["name"] 將訪問名稱屬于 “$properties” 數(shù)組名稱鍵(name key)的屬性。使用通用變量語法(Universal Variable Syntax)后,它將訪問名稱屬于 “$properties” 的屬性的名稱鍵。
或者更簡潔地說,如果使用以下語法:
????$obj->$properties["name"]
在 PHP 5.6,它將被解析為:
????$obj->{$properties["name"]}
而在 PHP 7 中則為:
????{$obj->$properties}["name"]
variable->variables 通常使用在邊界情況,根據(jù)我的經(jīng)驗(yàn), variable->properties??則更加常用,且不易用。然而,使用花括號(hào)(如上例所示)后,就可以輕易確保在 PHP 5.6 和 7 中達(dá)到相同效果。
性能升級(jí)到 PHP 7 的最大原因是性能提升,此性能提升主要是由于引入?phpng?的變化帶來的。實(shí)際上,性能提升可能帶來更高的采納率,尤其是那些一般情況下不愿意升級(jí)的小主機(jī),為了讓同一臺(tái)機(jī)器承載更多客戶,他們極有可能升級(jí)。
到目前為止,根據(jù)不同的基準(zhǔn)測試,PHP 7 的性能與 Facebooks HHVM 持平,后者的特點(diǎn)是借助實(shí)時(shí)(Just In Time)編譯器將 PHP 代碼編譯至機(jī)器指令(只要可以)。
PHP 7 不具備 JIT ,雖然相關(guān)討論沸沸揚(yáng)揚(yáng)。添加 JIT 之后能帶來多少性能提升尚未可知,但若有人有興趣創(chuàng)建一個(gè)的話,肯定非常有趣!
除了性能提升,還應(yīng)該節(jié)省大量的內(nèi)存,因?yàn)閮?nèi)部數(shù)據(jù)結(jié)構(gòu)的優(yōu)化一直是性能改進(jìn)實(shí)現(xiàn)的主要途徑。
向后不兼容的改變雖然內(nèi)部開發(fā)人員盡力不去打破向后兼容性( BC ),但是想要推進(jìn)語言的進(jìn)步,沒法總是兼顧兼容性。
然而,像由于統(tǒng)一變量語法(Uniform Variable Syntax)導(dǎo)致打破的向后兼容性,這些不兼容多是輕微的,比如 在試圖調(diào)用一個(gè)非對(duì)象的方法時(shí)導(dǎo)致的可捕獲的致命錯(cuò)誤:
????set_error_handler(function($code, $message) { ??????var_dump($code, $message); ????}); ????$var = null; ????$var->method(); ????echo $e->getMessage(); // Fatal Error: Call to a member function method() on null ????echo "Hello World"; // 依舊會(huì)運(yùn)行
此外,ASP 與腳本標(biāo)簽已被刪除,這意味著不可以再使用 <% 和 <%=,或 )。
其他更大的改變,可以在?移除的所有棄用函數(shù)?中看到。
最重要的不兼容性改變還包括,兼容 POSIX 的正則表達(dá)式擴(kuò)展、EXT/ereg(在 5.3 版本被棄用)和舊的 EXT/mysql 擴(kuò)展(在 5.5 版本被棄用)均被移除。
另一個(gè)小的不兼容性改變是不允許在 switch 中有多個(gè) default cases 。PHP 7 之前,以下是允許的:
????????switch ($expr) { ????????????default: ?????????????????echo "Hello World"; ?????????????????break; ????????????default: ?????????????????echo "Goodbye Moon!"; ?????????????????break; ????????}
這將導(dǎo)致只有后者被執(zhí)行。在 PHP 7 中,這將導(dǎo)致:
????Fatal error: Switch statements may only contain one default clause ????????????????-?Switch 語法只允許包含一個(gè)默認(rèn)子句新功能
在面對(duì)向后不兼容帶來的影響時(shí),我們頗有微詞。性能上的提升又讓我們歡欣鼓舞。但是,最讓我們醉心的是新的特性!新特性才是讓每次發(fā)布充滿樂趣的關(guān)鍵—— PHP 7 可不缺乏新特性。
標(biāo)量類型提示和返回類型我會(huì)最先介紹 PHP 7 添加的最具爭議的變化:標(biāo)量類型提示。這一特性的添加一開始并未通過投票。接著該作者撤回了該 RFC。之后,許多執(zhí)行之后相互抵觸的 RFC 被提了出來,經(jīng)過一番公開的討論,原先的這個(gè) RFC 還是通過了。
對(duì)于你,最終用戶,而言,這意味著你可以對(duì)標(biāo)量類型進(jìn)行類型提示( type-hint )。具體地說,標(biāo)量類型包括:int,float,string,和 bool 。默認(rèn)情況下,類型提示不是嚴(yán)格的,這意味著他們將迫使原始類型轉(zhuǎn)化為類型提示指定的類型。這意味著,如果你將 int(1) 傳入需要 float 類型的函數(shù),它會(huì)變?yōu)?float(1)。將 float(1.5) 傳入需要 int 類型的函數(shù),它會(huì)變?yōu)?int(1)。
這里的一個(gè)例子:
????function sendHttpStatus(int $statusCode, string $message) { ?????????header("HTTP/1.0 " .$statusCode. " " .$message); ????} ????sendHttpStatus(404, "File Not Found"); // 傳了整形和字符串 ????sendHttpStatus("403", "OK"); // 字符串 "403" 強(qiáng)轉(zhuǎn)為 int(403)
此外,將聲明?declare(strict_types=1); 放在任意文檔的頂部,可以啟用嚴(yán)格模式,文檔中的任何函數(shù)調(diào)用都必須遵從指定的類型。Strict 與否取決于函數(shù)調(diào)用的文件,而非函數(shù)定義的文件。
如果一個(gè)類型提示不匹配,一個(gè)可捕獲的致命錯(cuò)誤會(huì)被拋出:
????此外,PHP 7??還支持?返回類型提示,它支持所有相同的類型作參數(shù)。這遵循與?hack?相同的語法,在括號(hào)后面插入冒號(hào),然后是類型:
????function isValidStatusCode(int $statusCode): bool { ????????return isset($this->statuses[$statusCode]); ????}在這個(gè)例子中:bool 表明該函數(shù)將返回一個(gè)布爾值。
返回類型提示的嚴(yán)格模式遵從與類型提示相同的法則。
綜合比較運(yùn)算符我個(gè)人最喜歡的 PHP 7 新增特性是?綜合比較運(yùn)算符,<=>,也稱為飛船操作符。此處我可能是帶個(gè)人喜好的,因?yàn)槭俏覍懙淖畛跹a(bǔ)丁,也影響了命名(T_SPACESHIP)。但這仍是對(duì) PHP 語言的一個(gè)好補(bǔ)充,與大于和小于操作符形成互補(bǔ)。
實(shí)際上,該操作符的工作方式與 strcmp(),或 version_compare() 基本一致。如果左側(cè)操作數(shù)小于右側(cè),則返回 -1 , 兩邊相等則返回 0 ,如果左側(cè)大于右側(cè)則返回 1 。主要的區(qū)別在于,它可以用在任何兩個(gè)操作數(shù)間,不僅是字符串,還可以是整數(shù),浮點(diǎn)數(shù),數(shù)組等等。
該操作符最常見的用法是在排序回調(diào)中:
????// Pre Spacefaring^W PHP 7 ????function order_func($a, $b) { ????????return ($a < $b) ? -1 : (($a > $b) ? 1 : 0); ????} ????// Post PHP 7 ????function order_func($a, $b) { ????????return $a <=> $b; ????}OneAPM for PHP 能夠深入到所有 PHP 應(yīng)用內(nèi)部完成應(yīng)用性能管理 能夠深入到所有 PHP 應(yīng)用內(nèi)部完成應(yīng)用性能管理和監(jiān)控,包括代碼級(jí)別性能問題的可見性、性能瓶頸的快速識(shí)別與追溯、真實(shí)用戶體驗(yàn)監(jiān)控、服務(wù)器監(jiān)控和端到端的應(yīng)用性能管理。
下一步在本文中,我們了解了 PHP 7 中最重要的不兼容性修復(fù),已經(jīng)兩大新特性。
在接下來的第二篇文章中,我們將介紹 PHP 7 中重要的其他六個(gè)功能。另外,我們將在文章系列的最后介紹一些幫助 PHP 7 發(fā)展的方法。
原文鏈接:https://blog.engineyard.com/2015/what-to-expect-php-7
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/21192.html
摘要:在本系列的第一篇我們介紹了中最重要的一些不兼容性修復(fù)以及兩大新特性。例如這個(gè)綠色的心形,,可以表示為字符串。雖然現(xiàn)在它只具備內(nèi)部測試品質(zhì)目前已可以下載,但的確讓人期待。向項(xiàng)目報(bào)告錯(cuò)誤,并定期重試。 這是我們期待已久的 PHP 7 系列文章的第二篇。點(diǎn)此閱讀 第一篇本文系 OneAPM 工程師編譯整理。 也許你已經(jīng)知道,重頭戲 PHP 7 的發(fā)布將在今年到來!現(xiàn)在,讓我們來了解一下,新版...
摘要:在理想的情況下,我們甚至可以立即將應(yīng)用程序升級(jí)到。于是,在中,我們可以得到些什么正如我們所看到的,的新增特性除之外并不是很亮眼,盡管這些特性非常好用,但對(duì)于大多數(shù)應(yīng)用程序來說并不重要。 轉(zhuǎn)載請注明出處:葡萄城官網(wǎng),葡萄城為開發(fā)者提供專業(yè)的開發(fā)工具、解決方案和服務(wù),賦能開發(fā)者。 本文由葡萄城翻譯并發(fā)布 showImg(https://segmentfault.com/img/bVbrk...
摘要:的新特性說了這么多,看都會(huì)有哪些特性來改變我們寫代碼的方式呢局部變量類型推斷局部變量類型推斷可以說是中最值得注意的特性,這是語言開發(fā)人員為了簡化應(yīng)用程序的編寫而采取的又一步,如下圖所示。 showImg(https://segmentfault.com/img/remote/1460000015356980); Java 9才發(fā)布幾個(gè)月,很多玩意都沒整明白,現(xiàn)在Java 10又快要來了...
摘要:物聯(lián)網(wǎng)已經(jīng)成為現(xiàn)實(shí)只要去年單獨(dú)參加過會(huì)議或者搜索過專門的技術(shù)網(wǎng)站,你現(xiàn)在會(huì)越來越清楚地注意到物物互聯(lián)正在蓬勃發(fā)展。有大量的討論在口頭上承認(rèn)了物聯(lián)網(wǎng),年這方面的激烈討論只會(huì)更多。兩年過去了,期待已久的更新應(yīng)該在月日發(fā)布。 導(dǎo)讀 如果你還在為Oracle收購Sun公司給Java社區(qū)的變化所糾結(jié),請站在Oracle的角度替它想想吧。2013年大部分時(shí)間里,Oracle都在與遺留的Java安...
閱讀 1204·2021-09-22 15:37
閱讀 1231·2021-09-13 10:27
閱讀 2570·2021-08-25 09:38
閱讀 2519·2019-08-26 11:42
閱讀 1604·2019-08-26 11:39
閱讀 1656·2019-08-26 10:58
閱讀 2535·2019-08-26 10:56
閱讀 2646·2019-08-23 18:08