“最好的語言“ 25 歲了,PHP說要走向安全和開放!
本文經(jīng)AI新媒體量子位(公眾號ID:QbitAI)授權(quán)轉(zhuǎn)載,轉(zhuǎn)載請聯(lián)系出處。
今年 4 月,隨著PHP 7.4.5 正式發(fā)布,宣告PHP誕生25年,作為一門飽受爭議的編程語言,PHP 經(jīng)歷了什么,又準(zhǔn)備如何解決歷史遺留問題?
PHP 主要使用場景是前端開發(fā),并且被視為 WordPress 的“標(biāo)準(zhǔn)語言”,但 PHP 公認(rèn)的問題是安全性和較為混亂的開發(fā)環(huán)境配置。
就在最近,一場圍繞PHP的討論,在程序員聚集的HackerNews展開,要點(diǎn)如下。
正方:OOP進(jìn)化、對外開放和性能提升
面向?qū)ο缶幊蹋∣OP)的理念在PHP 4時代正式引入,但長期帶有嚴(yán)重的性能問題,因為實際上是通過一個帶有函數(shù)引用的數(shù)組來進(jìn)行實現(xiàn),直到PHP 5進(jìn)行重構(gòu),但也僅僅是勉強(qiáng)堪用,Hacker News一位網(wǎng)友就表示,多數(shù)人被勸退就在PHP 5時代。
直到PHP 7的發(fā)布,才真正達(dá)到可使用的狀態(tài),實現(xiàn)了例如函數(shù)參數(shù)、返回值的類型化以及標(biāo)量的直接使用。
在PHP 7.4上,加入了鍵入對象屬性的新功能,將這些功能與命名空間,交互接口和可迭代結(jié)合在一起,更加強(qiáng)大和易用。
雖然PHP已經(jīng)25周歲,但并未顯現(xiàn)老態(tài),反而更為樂于擁抱外面的世界。
這一趨勢在PHP 7.4版本表現(xiàn)的十分明顯,明確支持外部語言接口(Foreign Language Interface,F(xiàn)FI)模式,對基于C語言的擴(kuò)展包開放,允許更多外部擴(kuò)展包參與到PHP的編程與維護(hù)工作中。
在HN的討論區(qū)中,很多人表示希望WordPress增加更多的語言選項,但在可預(yù)見的未來,PHP仍將長期使用于WordPress的維護(hù)中。
在PHP 7.4之前,開發(fā)者更習(xí)慣于“內(nèi)置電池”的模式解決問題,好處是編寫起來簡單易懂,但代價是項目會隨著開發(fā)者的更換和語言的進(jìn)化逐漸變得難以維護(hù),向其他語言開放有助于解決這一問題。
PHP 7.4每秒處理的請求數(shù)量是PHP 5.6的三倍,甚至比PHP 7.0快約18%。
此外值得一提的是預(yù)加載能力的提升,開發(fā)者可以使用opcache.preload配置指令,并指定PHP腳本的路徑可以很容易地啟用這一模式。
該腳本中引用的所有類和函數(shù)將被永久加載到內(nèi)存中,并根據(jù)需要在每個服務(wù)器請求中進(jìn)行引用。
此外,預(yù)加載模式下的每個請求的資源是可復(fù)用的,因此可降低請求時間。
當(dāng)然,這也意味著如果要更改配置內(nèi)容必須重啟服務(wù)器。
反方:生態(tài)割裂和安全隱憂
長期以來,PHP的社區(qū)生態(tài)是割裂的。
擁有PEAR和PECL兩種包管理器,并且同時被官方支持,因為二者分別由C語言和PHP實現(xiàn),造成了更嚴(yán)重的不兼容問題。
并且,由于PHP的更新迭代,年代久遠(yuǎn)的包的維護(hù)和更新已經(jīng)成為了大問題,HN的討論熱點(diǎn)就主要集中在PHP的維護(hù)上,而非新項目的開發(fā)。
出于可維護(hù)性的考慮,從PHP 7.4開始,官方不建議再使用PEAR,PHP推出自己的包管理器,官方稱其為Composer,使用方式非常接近于Python的pip和Node的npm,極大減少了開發(fā)者的維護(hù)難度。
不出意外的話,PHP 7.X會陪伴我們很長時間,據(jù)消息,PHP 8.0的alpha版本會在6月份釋出,現(xiàn)存的PHP的bug會在 8.X時代修復(fù),主要更新會集中在安全上。
實際上,PHP最為人詬病的是安全性問題,無論是否贊成PHP是世界上最好的語言,但大多數(shù)前端開發(fā)者都承認(rèn)PHP的安全性較差。
而在PHP 5.4時代官方移除safe_mode,更是勸退了大波開發(fā)者,在意識到問題后,PHP重新支持這一模式。
雖然有所反復(fù),但總歸是好事一樁。近期的PHP開始使用Argon2 password-hashing 算法,這是多年密碼學(xué)哈希算法競賽的冠軍,也許是為表明對安全性的重視。
你認(rèn)為PHP能否繼續(xù)在前端開發(fā)中保持熱度呢?