新聞中心

創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價比利通網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式利通網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋利通地區(qū)。費用合理售后完善,十年實體公司更值得信賴。
PHP 7 新特性
PHP 7 中的新特性主要有以下幾點:
- 標(biāo)量類型聲明。
- 函數(shù)返回值類型聲明。
- 新增 null 合并運算符。
- 新增組合比較符。
- 支持通過 define() 定義常量數(shù)組。
- 新增支持匿名類。
- 支持 Unicode codepoint 轉(zhuǎn)譯語法。
- 更好的閉包支持。
- 為 unserialize() 提供過濾。
- 新增加 IntlChar 類。
- 支持 use 語句從同一 namespace 導(dǎo)入類、函數(shù)和常量。
- 新增整除函數(shù) intdiv()。
- session_start() 支持接收數(shù)組參數(shù)。
除了以上列舉的 13 點新特性之外,還有其他一些變更,讀者可到 http://php.net/manual/zh/migration70.new-features.php 查看有關(guān) PHP 7 新特性的詳細(xì)變更和示例。
PHP 7 的改進(jìn)和優(yōu)化
相較于以前的版本,PHP 7 在語言語法層面和底層架構(gòu)層面都有一些改進(jìn):
- 在語法層面的改進(jìn)主要是增加了一些新特性、移除了一些擴展、改變了錯誤異常處理等。
- 在底層結(jié)構(gòu)方面,改變了存儲各種變量的 Zval 和 Zend_String 結(jié)構(gòu)體、優(yōu)化了 Zend Array 的 HashTable、改進(jìn)了函數(shù)的調(diào)用機制等。
尤其是底層結(jié)構(gòu)的改進(jìn),大幅提升了 PHP 7 的執(zhí)行效率,使得其執(zhí)行速度比 PHP 5 高出一倍左右。
PHP 7 引入了嚴(yán)格模式開關(guān)
PHP 是一個弱類型的語言,不過在 PHP 7 中支持變量類型的定義,引入了一個開關(guān)指令
declare(strict_type=1);。這個指令一旦開啟,就會強制當(dāng)前文件下的程序遵循嚴(yán)格的函數(shù)傳參類型和返回類型。不開啟 strict_type,PHP 將會嘗試轉(zhuǎn)換成要求的類型;開啟之后,PHP 不再做類型轉(zhuǎn)換,類型不匹配就會拋出錯誤。
要使用嚴(yán)格模式,一個 declare 聲明指令必須放在文件的頂部。這意味著嚴(yán)格聲明標(biāo)量是基于文件可配的。這個指令不僅影響參數(shù)的類型聲明,還影響函數(shù)的返回值聲明。
PHP 7 改進(jìn)了錯誤處理機制
另外,在 PHP 7 中,很多致命錯誤以及可恢復(fù)的致命錯誤都被轉(zhuǎn)換為異常來處理了。這些異常繼承自 Error 類,此類實現(xiàn)了 Throwable 接口(所有異常都實現(xiàn)了這個基礎(chǔ)接口)。
這也意味著,當(dāng)發(fā)生錯誤的時候,以前代碼中的一些錯誤處理的代碼將無法被觸發(fā)。因為在 PHP 7 版本中,已經(jīng)使用拋出異常的錯誤處理機制了。(如果代碼中沒有捕獲 Error 異常,就會引發(fā)致命錯誤)。
PHP 7 優(yōu)化了 Zval
在 2013 年的時候,惠新宸和 Dmitry(PHP 語言內(nèi)核開發(fā)者之一)就曾經(jīng)在 PHP 5.5 的版本上做過一個 JIT(Just In Time,即時編譯,一種軟件優(yōu)化技術(shù))的嘗試。
PHP 5.5 原來的執(zhí)行流程是將 PHP 代碼通過詞法和語法分析編譯成 opcode 字節(jié)碼,然后 Zend 引擎讀取這些 opcode 指令,逐條解析執(zhí)行。他們在 opcode 環(huán)節(jié)后又引入了類型推斷(TypeInf),然后通過 JIT 生成 ByteCodes 再執(zhí)行。
采用這種技術(shù)優(yōu)化,PHP 的效率在實際項目中并沒有取得明顯的提升,于是他們重新設(shè)計了 PHP 的底層語言結(jié)構(gòu)。Zval 是存儲 PHP 中變量的載體,是一個 C 語言實現(xiàn)的結(jié)構(gòu)體(struct),PHP 5 的 Zval 在內(nèi)存中占據(jù) 24 個字節(jié),而在 PHP 7 中優(yōu)化后的 Zval 只占 16 個字節(jié),這樣變量的存儲變得非常簡單和高效。
PHP 7 優(yōu)化了數(shù)組
PHP 7 優(yōu)化了數(shù)組的 HashTable 實現(xiàn),PHP 5 的數(shù)組存儲形式是一個支持雙向鏈表的 HashTable,不僅支持通過數(shù)組的 key 來做 hash 映射訪問元素,也能通過 foreach 以訪問雙向鏈表的方式遍歷數(shù)組元素。
當(dāng)我們通過 key 值訪問一個元素內(nèi)容的時候,有時需要 3 次的指針跳躍才能找對需要的內(nèi)容。最重要的一點是,這些數(shù)組元素的存儲是分散在各個不同的內(nèi)存區(qū)域的,在 CPU 讀取的時候,因為它們很可能不在同一級緩存中,導(dǎo)致 CPU 不得不到下級緩存甚至內(nèi)存區(qū)域查找,從而引起 CPU 緩存命中下降,進(jìn)而增加更多的耗時。
優(yōu)化后的 Zend Array 最大的特點是整塊的數(shù)組元素和 hash 映射表全部連接在一起,被分配在同一塊內(nèi)存中。如果是遍歷一個整型的簡單類型數(shù)組,效率會非??欤驗閿?shù)組元素(Bucket)本身是連續(xù)分配在同一塊內(nèi)存里的,并且數(shù)組元素的 Zval 會把整型元素存儲在內(nèi)部,也不再有指針外鏈,全部數(shù)據(jù)都存儲在當(dāng)前內(nèi)存區(qū)域內(nèi)。
當(dāng)然,最重要的是它能夠避免 CPU 緩存命中率下降。
PHP 7 改進(jìn)了函數(shù)調(diào)用
PHP 7 還改進(jìn)了函數(shù)的調(diào)用機制,通過優(yōu)化參數(shù)傳遞的環(huán)節(jié)減少了一些指令,提高執(zhí)行效率。
標(biāo)題名稱:PHP7有哪些新特性?做了哪些改進(jìn)?
URL鏈接:http://www.dlmjj.cn/article/dpdigdi.html


咨詢
建站咨詢
