PHP老矣,尚能飯否?
當(dāng)前位置:點(diǎn)晴教程→知識(shí)管理交流
→『 技術(shù)文檔交流 』
導(dǎo)讀 👉目錄 1 PHP 從輝煌到走向沒落? 2 PHP 流行度下降的原因 3 PHP 編程語言生態(tài) 4 工程規(guī)范更重要 5 PHP 語言還值得學(xué)習(xí)嗎? 6 PHP 的未來發(fā)展趨勢(shì) 7 結(jié)語
眾所周知,PHP 語言誕生于 1995 年,它最初只是一個(gè)處理 HTTP 表單的腳本工具。在后續(xù)的版本中增加了 MySQL 數(shù)據(jù)庫(kù)查詢的支持,才逐漸成為一門獨(dú)立的 Web 項(xiàng)目開發(fā)語言。隨著互聯(lián)網(wǎng)的迅猛發(fā)展,因 PHP 易學(xué)易用和強(qiáng)大的開發(fā)社區(qū)而備受青睞,成為了互聯(lián)網(wǎng)應(yīng)用開發(fā)的主要語言之一。與 Linux、MySQL、Apache 合并稱為 LAMP 技術(shù)棧,LAMP 對(duì)互聯(lián)網(wǎng)的影響巨大,逐漸成為構(gòu)建動(dòng)態(tài)網(wǎng)站和應(yīng)用程序的主要技術(shù)架構(gòu),據(jù) W3C 的統(tǒng)計(jì),全球有接近 78% 的 Web 網(wǎng)站是基于 PHP 開發(fā)構(gòu)建的。 值得一提的是,PHP 以其低成本、易用、靈活性和可擴(kuò)展、繁榮的 Web 技術(shù)生態(tài),一度在編程開發(fā)領(lǐng)域占據(jù)著重要的地位,與 Java 語言并駕齊驅(qū)。 而隨著移動(dòng)互聯(lián)網(wǎng)、云計(jì)算、人工智能等新技術(shù)的興起,互聯(lián)網(wǎng)軟件系統(tǒng)變得越來越復(fù)雜。大型網(wǎng)站系統(tǒng)對(duì)于高并發(fā)、可用性的要求也越來越高。Java 相比 PHP 擁有類型安全、更好的性能、多線程連接池技術(shù)、更嚴(yán)格的編程規(guī)范,并且在服務(wù)治理方面擁有更成熟的解決方案和生態(tài)。很多技術(shù)團(tuán)隊(duì)更傾向于使用 Java 構(gòu)建 Web 系統(tǒng),而非 PHP。 除此之外,伴隨如 Node.js、Golang 等新編程語言的出現(xiàn),它們?cè)谀承┓矫婢哂?PHP 不具備的優(yōu)勢(shì),例如靜態(tài)編譯、更好的性能和異步編程。這些編程語言也在蓬勃發(fā)展,被越來越多的開發(fā)者使用。 雖然 PHP 社區(qū)也在不斷努力改進(jìn)語言本身,但 PHP 在某些領(lǐng)域的競(jìng)爭(zhēng)地位逐漸被其他語言所取代,隨著時(shí)代的發(fā)展,一些重要的網(wǎng)站和應(yīng)用開始轉(zhuǎn)向其他語言和框架,這導(dǎo)致了一些人對(duì) PHP 的未來產(chǎn)生了質(zhì)疑,很多開發(fā)者認(rèn)為 PHP 正在走向沒落。近期 TIOBE 最新指數(shù)顯示,PHP 的流行度降至了歷史最低,排在第 17 名,也說明了這一點(diǎn),開發(fā)者正在對(duì) PHP 失去信心,轉(zhuǎn)向其他編程語言。
外因是時(shí)代的變化,互聯(lián)網(wǎng)的熱潮已退去,現(xiàn)在是人工智能的時(shí)代,Python 現(xiàn)在是最流行的編程語言,其他的編程語言的關(guān)注度都在下降。內(nèi)因有以下3個(gè):
盡管如此,PHP 仍然是一門不錯(cuò)的編程語言技術(shù),許多網(wǎng)站和 Web 應(yīng)用仍然在使用它。PHP 社區(qū)和開發(fā)者們也在不斷努力改進(jìn) PHP,使其能夠適應(yīng)新的技術(shù)趨勢(shì)和市場(chǎng)需求,盡管可能會(huì)經(jīng)歷了一段時(shí)間的沒落,但 PHP 仍然會(huì)在編程開發(fā)領(lǐng)域中扮演著重要角色,這無疑得益于其強(qiáng)大的生態(tài)系統(tǒng)。
其實(shí),生態(tài)對(duì)于編程開發(fā)的重要性是不可忽視的,包括開發(fā)工具、庫(kù)、框架、社區(qū)、文檔、教程、第三方服務(wù)和支持等。生態(tài)系統(tǒng)的健康與發(fā)展直接影響著開發(fā)者的工作效率、項(xiàng)目的成功和技術(shù)的發(fā)展。 在我看來,PHP 只在 Web 開發(fā)領(lǐng)域是很成熟的,而 Java 在桌面軟件、Android、大數(shù)據(jù)、金融系統(tǒng)、電商平臺(tái)均有成熟的生態(tài)。Python 在數(shù)據(jù)科學(xué)、人工智能、機(jī)器學(xué)習(xí)、科學(xué)計(jì)算、教育等領(lǐng)域有廣泛應(yīng)用,尤其是隨著 AI 時(shí)代的到來,Python 成為當(dāng)下最為炙手可熱的技術(shù)。Golang 云原生、基礎(chǔ)服務(wù)器端軟件方面取代了 C/C++。而 Node.js 在前端、單頁(yè)面應(yīng)用(SPA)、全棧開發(fā)方面具備優(yōu)勢(shì)。 相比之下 PHP 的生態(tài)非常單一,這也使得 PHP 的局限性尤為明顯。而似乎 PHP 官方團(tuán)隊(duì)似乎對(duì)于 Web 開發(fā)之外的生態(tài)支持興趣不大,主要的版本更新也依然是圍繞著 PHP-FPM/Apache 這樣的 Web 服務(wù)器進(jìn)行著。 不過幸好 PHP 社區(qū)有 Swoole 這樣類似于 Golang 的異步協(xié)程方案,從而彌補(bǔ)了 PHP 在異步并發(fā)編程、網(wǎng)絡(luò)通信方面的一些不足。Swoole 的引入也為開發(fā)者提供了更多選擇和靈活性,使他們能夠更好地應(yīng)對(duì)復(fù)雜的應(yīng)用場(chǎng)景和高并發(fā)需求。此外,在軟件開發(fā)過程中,良好的工程規(guī)范也是保證項(xiàng)目質(zhì)量和開發(fā)效率的又一關(guān)鍵要素。
隨著項(xiàng)目研發(fā)的經(jīng)驗(yàn)越來越多,我深刻體會(huì)到工程規(guī)范比開發(fā)的速度更重要。良好的工程規(guī)范能夠確保項(xiàng)目的長(zhǎng)期可維護(hù)性、可擴(kuò)展性和穩(wěn)定性,雖然追求快速開發(fā)可能在短期內(nèi)帶來一些優(yōu)勢(shì),但長(zhǎng)期來看,缺乏規(guī)范的項(xiàng)目可能會(huì)面臨諸多問題,包括但不限于以下這些:
若我們不重視工程規(guī)范,隨著項(xiàng)目持續(xù)時(shí)間的增加,將會(huì)造成嚴(yán)重的后果,甚至導(dǎo)致項(xiàng)目研發(fā)停滯。而 PHP 社區(qū)有很多優(yōu)秀的項(xiàng)目,可以幫助項(xiàng)目提高工程規(guī)范:
不過從編程語言的角度上,PHP 相比 Java 在規(guī)范上存在一些天然的缺陷,早期甚至連 namespace 都不支持,面向?qū)ο蟮奶匦灾С忠膊粔蛲暾?。雖然在 PHP7 版本做了大量改進(jìn),但最新的 PHP 依然存在以下的問題: 嚴(yán)格類型更容易寫出工程規(guī)范的代碼。這一點(diǎn)基本上是開發(fā)者之間的廣泛共識(shí)。弱類型編程基本上就是 “開發(fā)一時(shí)爽,重構(gòu)火葬場(chǎng)”。 現(xiàn)在的 PHP 其實(shí)已經(jīng)在大部分語法上支持了類型限定,例如: 1、函數(shù)參數(shù)和返回值
2、對(duì)象屬性
在開發(fā)中也建議啟用嚴(yán)格模式:
但遺憾的是在 PHP 最常用的數(shù)組依然是一個(gè)類型黑洞:
由于 PHP 的數(shù)組是無類型的,將有嚴(yán)格類型的變量存入數(shù)組后再取出就出現(xiàn)了類型的丟失。這也是為什么 Facebook 實(shí)現(xiàn)的 HHVM 最終選擇不再兼容 PHP,而是獨(dú)立為一門新的語言 Hack,在 Hack 語言中實(shí)現(xiàn)了徹底的嚴(yán)格類型。 一個(gè)軟件開發(fā)完整流程包括開發(fā)、測(cè)試、構(gòu)建、部署運(yùn)行,Java 和 Golang 這樣的靜態(tài)語言是比較好的,軟件開發(fā)測(cè)試完成發(fā)布版本后,應(yīng)用程序?qū)?gòu)建為一份二進(jìn)制程序,分發(fā)和部署不再需要源碼。而 PHP 大部分是直接部署源碼運(yùn)行的,就導(dǎo)致出現(xiàn)了一些列問題:
雖然現(xiàn)在很多開發(fā)者使用 Docker 鏡像構(gòu)建和部署,解決了一些問題。但PHP 依然存在一些不足,很多上古時(shí)期的 PHP 開發(fā)者認(rèn)為熱更新是 PHP 的優(yōu)勢(shì),實(shí)際上熱更新只在開發(fā)測(cè)試環(huán)境中有價(jià)值,線上部署運(yùn)行的服務(wù)是不會(huì)熱更新的,而且 PHP 的核心開發(fā)者們,依然頑固地堅(jiān)持著熱更新這個(gè)特性。 PHP 語言內(nèi)置的函數(shù)全部是在根命名空間內(nèi)的,并且部分內(nèi)置函數(shù)的命名規(guī)范還是錯(cuò)誤的,例如:
內(nèi)置函數(shù)的參數(shù)順序非常混亂,以數(shù)組操作函數(shù)為例,array_search 和 array_filter,分別是搜索數(shù)組是否存在一個(gè)元素,后者是從數(shù)組篩選出一些符合條件的元素。
因?yàn)閿?shù)組本身不是始終為第一個(gè)參數(shù),所以導(dǎo)致開發(fā)者無法記憶,每次都需要去看文檔,以確定參數(shù)在前還是在后。
盡管如此,我認(rèn)為 PHP 語言還是值得學(xué)習(xí)的,相比現(xiàn)在主流的編程語言 Java、Python、C++,以及流行的 Node.js、Rust、Golang 等新型編程語言,PHP 有其無法被取代的獨(dú)特優(yōu)勢(shì),是一個(gè)非常便捷的開發(fā)工具集,可以幫助開發(fā)者節(jié)約很多時(shí)間。 首先,PHP 相較于大多數(shù)編程語言來說,沒有太復(fù)雜的語法,不像某些編程語言,有些語法實(shí)在難以理解,比如 C++ 的 move/forward(這在 C++ 中還算是比較簡(jiǎn)單的,C++ 甚至有語言律師這個(gè)職業(yè))。 其次,它不需要考慮整型溢出、符號(hào)之類的問題,C++ 或 Golang 中的 int8/int16/int32/int64/uint8/uint16/uint32/uint64。 再者,它沒有指針的概念,也不會(huì)遇到 Java 和 Golang 的空指針異常這類開發(fā)者頭痛的問題。 同時(shí),它也沒有 Python 中各種眼花繚亂的語法,或 JavaScript 中 0 和 []、'\t'、'0' 三位一體的燒腦問題。 綜上,客觀來說 PHP 語言就是一種樸實(shí)無華,入門友好的編程語言,加上它比較簡(jiǎn)單,學(xué)習(xí)的成本極低。 PHP 語言自帶一個(gè)龐大的函數(shù)庫(kù),各種功能應(yīng)有盡有。這些函數(shù)庫(kù)涵蓋了各種各樣的功能和用途,讓開發(fā)者能夠更輕松地實(shí)現(xiàn)各種軟件功能,包括字符串、數(shù)組、日期、數(shù)學(xué)、正則表達(dá)式、JSON、XML、文件操作、郵件、網(wǎng)絡(luò)通信、數(shù)據(jù)庫(kù)操作、密碼、加密、圖像處理、終端和進(jìn)程管理、國(guó)際化與字符編碼支持等等。 相比其他語言,需要自己編寫很多代碼去實(shí)現(xiàn)一個(gè)功能,或者依賴各種第三方庫(kù)實(shí)現(xiàn),PHP 就直接可以用內(nèi)置函數(shù)實(shí)現(xiàn)。例如: 1、版本比較 要比較兩個(gè)格式為 x.y.z 的版本號(hào)哪個(gè)更高,可以使用 version_compare:
2、通配符計(jì)算
3、路徑計(jì)算 獲取一個(gè)文件路徑字符串的目錄、擴(kuò)展名、文件名:
還有一個(gè)更有趣的擴(kuò)展庫(kù),可以在 PHP 中直接調(diào)用 Python 中的函數(shù),借此 PHP 也可以直接使用 PyTorch、TensorFlow 等 AI 庫(kù),運(yùn)行 AI 大模型推理、訓(xùn)練,調(diào)用 transformers、Paddle NLP、modelscope 的 AI 能力https://github.com/swoole/phpy 。 4、transformers
5、modelscope
6、paddle NLP
7、gradio client 作為 Gradio 客戶端,調(diào)用 AI 模型的能力:
各種常用的編程語言中 PHP 的字符串處理能力是最強(qiáng)大的,沒有之一。PHP 除了是一個(gè)編程語言之外,還是一個(gè)模版語言??梢灾苯釉谀0嬷星度?PHP 表達(dá)式,使用起來甚至比 Vue 或 React JSX 模版更強(qiáng)大。 注意:缺點(diǎn)只是不能在瀏覽器中運(yùn)行 例如下面的代碼,可以模版中使用任意 PHP 語法,沒有任何限制:
自從 PHP 基金會(huì)成立后,它每年可以收到上百萬美金的捐助,PHP 語言官方開發(fā)團(tuán)隊(duì)的貢獻(xiàn)也越來越穩(wěn)定。很多編程語言的問題,相信可以在未來都能得以解決。 以 Laravel、Symfony 為代表的 PHP 框架現(xiàn)在也越來越成熟,逐漸拉近了與 Java Spring 框架的距離。而協(xié)程擴(kuò)展項(xiàng)目 Swoole 在今年也推出了 v6.0 的計(jì)劃,為 PHP 引入了多線程+協(xié)程的并發(fā)編程方案。 除此之外,PHP 社區(qū)中還誕生了很多有趣的新項(xiàng)目,例如:
總而言之,在我看來,PHP 語言整體發(fā)展仍是穩(wěn)中向前,在未來重新流行起來也是極有可能的。最后,我也分別給企業(yè)和開發(fā)者們一些可供參考的建議。 首先,對(duì)于企業(yè)選型 PHP 來說,在數(shù)千萬甚至上億用戶活躍的大型 Web 系統(tǒng)中,PHP 技術(shù)??赡軙?huì)面臨各種挑戰(zhàn)和難題,使用 Java 或 Golang 可以容易獲得更好的性能、工程規(guī)范、高并發(fā)和高可用性、更成熟的服務(wù)治理方案。但絕大部分項(xiàng)目不會(huì)有如此大規(guī)模的用戶量級(jí)和復(fù)雜度,使用 PHP 技術(shù)棧的開發(fā)團(tuán)隊(duì)依然是比較有性價(jià)比的選擇。研發(fā)團(tuán)隊(duì)可以以較少的人力資源投入保持更快的迭代速度,在當(dāng)下開源節(jié)流的大趨勢(shì)下尤為重要。 其次,對(duì)于 PHP 開發(fā)者們而言,第一,我們要學(xué)習(xí) AI,使用 ChatGPT、Github Copliot 等工具提升自己的開發(fā)效率,了解 Transformers 等大模型的原理;第二,我們可以使用 Docker 鏡像和 Docker Swarm 容器編排工具、Docker Compose 實(shí)現(xiàn)本機(jī)的容器啟動(dòng)管理;第三,我們也要掌握 Vue/React/ElementUI 等前端技術(shù)棧,要具備全棧開發(fā)的能力;最后,學(xué)習(xí) C++/Golang/Java 等其他編程語言技術(shù),不僅僅局限于 PHP 一種編程語言也是十分必要的。 韓天峰,騰訊云 TVP,識(shí)沃科技 CEO,Swoole 開源項(xiàng)目創(chuàng)始人,PHP 官方 PECL 開發(fā)組成員。曾任好未來學(xué)而思網(wǎng)校首席架構(gòu)師,在騰訊朋友網(wǎng)、淘寶搜索、虎牙直播等互聯(lián)網(wǎng)企業(yè)擔(dān)任架構(gòu)師和技術(shù)負(fù)責(zé)人。 該文章在 2024/5/21 17:26:18 編輯過 |
相關(guān)文章
正在查詢... |