PHP 現(xiàn)在名聲很糟糕,因?yàn)樗?jīng)是“可怕”的。

本文試著回答一些常見的關(guān)于 PHP 的斷言,目的是向非技術(shù)人員解釋,PHP 并不像許多人所說的那么糟糕。


1、它是不是鼓勵(lì)糟糕的實(shí)踐?

不再是了。過去,許多開發(fā)者被書本教授非常糟糕的實(shí)踐,因此 PHP 代碼的質(zhì)量非常差。PHP 曾經(jīng)還允許你做一些非常奇怪的事情,使得它非常容易構(gòu)建,但維護(hù)起來卻是一場(chǎng)噩夢(mèng)。

這些不再是常見的問題。隨著高質(zhì)量學(xué)習(xí)材料的引入,這些材料易學(xué)且易獲取,一名新的開發(fā)人員可以以正確的方式學(xué)習(xí) PHP。這樣就可以避免初級(jí)開發(fā)者因?yàn)椴恢罉?gòu)建事物的正確方法而編寫一些維護(hù)起來非常痛苦的代碼。

隨著框架的引入,導(dǎo)致許多糟糕體驗(yàn)的大部分通用代碼現(xiàn)在都自動(dòng)完成了;因此,開發(fā)人員只需使用框架,框架就可以正確地對(duì)其進(jìn)行編碼。

而且,這些年來,一些糟糕的實(shí)踐是由缺失的特性造成的,導(dǎo)致了一些本不應(yīng)該被允許的事情被允許。現(xiàn)在大多數(shù)情況下,甚至不可能實(shí)現(xiàn)以前編寫的一些東西來導(dǎo)致這種聲譽(yù)。


小結(jié)

它不再鼓勵(lì)糟糕的實(shí)踐…

通過使用框架避免了糟糕實(shí)踐。

語言特性現(xiàn)在有很多討論。糟糕的特性不再受到支持。

PHP 添加了其他語言中存在的大部分(即使不是全部)的特性。


2、它的安全性是不是很差?

過去,PHP 應(yīng)用程序的安全性通常很差,因?yàn)檎Z言允許這樣做。這些東西不再被使用,因?yàn)?PHP 應(yīng)用程序的開發(fā)現(xiàn)在已經(jīng)完全不同。


通過使用自動(dòng)加載程序來包含文件而不是動(dòng)態(tài)包含文件,已經(jīng)移除了遠(yuǎn)程和本地文件包含(其中 PHP 從其它地址而不是最初打算的地址讀取文件)。


通過廣泛使用模板系統(tǒng)(可以自動(dòng)處理顯示動(dòng)態(tài)內(nèi)容的轉(zhuǎn)義和安全問題),已經(jīng)避免了由于直接在 PHP 中直接使用 HTML 所導(dǎo)致的跨站腳本攻擊(其中一個(gè)用戶將 JavaScript 腳本添加到要顯示給另一個(gè)用戶的地方)。


通過在 SQL 中使用 prepared 語句,避免了 SQL 注入攻擊(這是由于需要構(gòu)建 SQL 查詢并將查詢和數(shù)據(jù)一起發(fā)送導(dǎo)致的,其中用戶可以向查詢中增加額外的 SQL 命令)。另外,ORM 的使用也很普遍,它確保用戶數(shù)據(jù)和查詢是分開發(fā)送的,而 SQL 不能將其視為多帶帶的命令。


通過廣泛使用且采用 nonce 系統(tǒng)的 form 庫,避免了跨站請(qǐng)求偽造(其中,用戶能夠被誘騙在你的站點(diǎn)上執(zhí)行某些操作)。


小結(jié)

通過使用自動(dòng)加載程序(所有主流框架的標(biāo)配),避免了遠(yuǎn)程和本地文件包含。

通過使用模板語言作為標(biāo)準(zhǔn)或一種前端框架(例如 React),避免了跨站腳本(XSS)攻擊。

通過使用 ORMs 和廣泛使用 prepared 語句,避免了 SQL 注入。

通過使用 nonce token(被所有主流框架自動(dòng)支持),避免了跨站請(qǐng)求偽造(CRSF)攻擊。


3、它是不是真的很慢?

這取決于你把它與什么比較。如果你把 PHP 與 Java、C 或者 Go 比較,那么它是比較慢。但是如果你把 PHP 與 Python、Ruby 等等比較,那么它并不慢。在同類型的語言中,PHP 是最快的之一,并且不斷在提高性能。


大多數(shù)情況下,你的應(yīng)用程序慢是因?yàn)榉?wù)器過載或者數(shù)據(jù)庫查詢慢。這些問題在任何語言中都會(huì)存在。


小結(jié)

PHP 與編譯型語言相比是比較慢。

PHP 與其它腳本型語言相比是比較快的。

網(wǎng)站慢通常不是由于使用的語言不夠快,而是因?yàn)榉?wù)器或數(shù)據(jù)庫導(dǎo)致的性能問題。


4、它的伸縮性是不是真的很差?

實(shí)際上,任何語言都可以伸縮。編譯型語言(例如 Go、C 或 Rust)比腳本型語言(例如 PHP)的擴(kuò)展成本更低。然而,它們并不是為了同樣的任務(wù)而設(shè)計(jì)的。事實(shí)上,它們都是一樣的;這簡單地歸結(jié)于你使用的服務(wù)器數(shù)量。如果你使用足夠多的服務(wù)器,你可以擴(kuò)展任何應(yīng)用程序。PHP 比其它腳本型語言的擴(kuò)展成本更低,因?yàn)樗枰俚馁Y源來開始運(yùn)行,并且可以在具有更多 CPU 的較小內(nèi)存的服務(wù)器上運(yùn)行。


另外,對(duì)于伸縮性,重要的是數(shù)據(jù)庫。如果你能夠擴(kuò)展你的數(shù)據(jù)庫,你就可以擴(kuò)展你的應(yīng)用程序。數(shù)據(jù)庫比應(yīng)用服務(wù)器更難擴(kuò)展。增加另一個(gè)讀取數(shù)據(jù)庫的客戶端很容易;但是,讓數(shù)據(jù)庫快速運(yùn)行要難得多。


小結(jié)

任何語言都可以伸縮;這取決于你使用多少服務(wù)器。

擴(kuò)展的真正問題是數(shù)據(jù)庫而不是所使用的應(yīng)用程序語言。

如果你能夠擴(kuò)展你的數(shù)據(jù),你就能擴(kuò)展你的應(yīng)用程序。


5、我應(yīng)該一直使用它嗎?

不。每種編程語言都有其擅長的領(lǐng)域。PHP 非常適合 Web 應(yīng)用程序。你應(yīng)該用它來構(gòu)建網(wǎng)站和 API。

如果你正在構(gòu)建一個(gè)系統(tǒng)應(yīng)用程序,其中每毫秒都很重要,使用 Rust 或者 C。

如果你正在構(gòu)建一個(gè)人工智能應(yīng)用程序,Python 是一個(gè)好選項(xiàng)。

如果你正在構(gòu)建一個(gè) SaaS 應(yīng)用程序,PHP 是一個(gè)好選項(xiàng)。

如果你正在構(gòu)建一個(gè)安卓應(yīng)用程序,Kotlin 是一個(gè)好選項(xiàng)。

如果你正在構(gòu)建一個(gè)運(yùn)行在多個(gè)平臺(tái)上的應(yīng)用程序,Java 是一個(gè)好選項(xiàng)。


小結(jié)

每種語言都有其最佳用例。

PHP 的最佳用例是 Web 應(yīng)用程序。

Go、Rust、C 適合系統(tǒng)應(yīng)用程序。

Python 適合人工智能。

Kotlin 適合安卓應(yīng)用程序。

Java 適合與平臺(tái)無關(guān)的應(yīng)用程序。


6、結(jié)論

每年都有在吐槽php,可是你這個(gè)phper現(xiàn)在過期了嗎?很多關(guān)于 PHP 的說法都已經(jīng)過時(shí) 10 年了。在我看來,如果有人給你關(guān)于某個(gè)技術(shù)主題的過期 10 年的信息,那么這個(gè)人可能不是你想要信任的技術(shù)專家。


PHP 是創(chuàng)建 Web 應(yīng)用程序的一門好編程語言,我認(rèn)為它是實(shí)現(xiàn) Web 應(yīng)用程序開發(fā)的最佳語言。