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ù)起來卻是一場噩夢。
這些不再是常見的問題。隨著高質(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 不能將其視為單獨(dú)的命令。
通過廣泛使用且采用 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)行,并且可以在具有