新聞中心

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


咨詢
建站咨詢
