PHP 現(xiàn)在名聲很糟糕,因為它曾經(jīng)是“可怕”的。

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


1、它是不是鼓勵糟糕的實踐?

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

這些不再是常見的問題。隨著高質(zhì)量學習材料的引入,這些材料易學且易獲取,一名新的開發(fā)人員可以以正確的方式學習 PHP。這樣就可以避免初級開發(fā)者因為不知道構(gòu)建事物的正確方法而編寫一些維護起來非常痛苦的代碼。

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

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


小結(jié)

它不再鼓勵糟糕的實踐…

通過使用框架避免了糟糕實踐。

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

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


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

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


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


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


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


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


小結(jié)

通過使用自動加載程序(所有主流框架的標配),避免了遠程和本地文件包含。

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

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

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


3、它是不是真的很慢?

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


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


小結(jié)

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

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

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


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

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


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


小結(jié)

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

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

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


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

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

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

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

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

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

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


小結(jié)

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

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

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

Python 適合人工智能。

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

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


6、結(jié)論

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


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