PHP 開發 「十宗罪」

young發表於2017-11-04

前言

本文翻譯自 10 Things Not To Do In PHP 7。全文列出了十條我們在 PHP7 開發中應注意避免的 反模式,覺得很有參考意義故翻譯成中文供大家學習借鑑。

1. 不要使用 mysql_ 函式

在 PHP7 中,mysql_ 系列函式已經完全從核心程式碼中移除,你應該用改進過的 mysqli_ 系列函式(mysql improvement)來替換 mysql_ 程式碼。或者你也可以使用更具靈活性的 PDO 來重構你的程式。

2.不要寫慢程式碼

PHP 7 中速度顯著的增加可能會使你忽略一些糟糕的拖慢程式速度的程式碼,不要因為切換到 PHP 7 了而對這些問題漠不關心。
要了解網站速度的重要性以及如何讓網站速度變得更快,請閱讀 Beginners’ guide to speed optimization 以改進你的程式碼。
作為開發人員,你應該始終確保只在需要時才載入指令碼,編寫高效的資料庫查詢,儘可能使用快取來加速訪問等等。

3.不要在檔案末尾新增 PHP 閉合標籤

如果你閱讀過 wordpress 原始碼,你就會發現大部分 PHP 檔案末尾都省略了 PHP 閉合標籤。而在 Zend 框架中特別 指明 禁止在檔案末尾使用閉合標籤。PHP 並不強制要求你新增閉合標籤,在檔案末尾省略它可以確保不會無意中新增額外的空格。

4.不要使用傳遞引用

我個人不喜歡使用傳遞引用。但在某些情況下傳遞引用是十分有用的,可是在大多數情況下,它會使程式碼更難閱讀和理解,而且會出現難以預料結果。有些人認為使用引用可以使他們的程式碼更快,但實際上這是錯誤的
在 PHP 中使用傳遞引用的一個糟糕的例子可能就是 shuffle() sort() 函式。它們不是返回一個隨機排序或排序過的陣列,而是修改原來的陣列,這在我看來是完全不合邏輯和反人類的。

5.不要在迴圈中執行查詢

在迴圈中執行資料庫查詢完全就是在浪費資源。它會給伺服器帶來不必要的壓力(譯者注:迴圈中執行查詢會導致 N+1 問題),並且你完全可以在迴圈之外得到相同的結果。當遇到這種情況時,你往往可以用兩個單獨的查詢來得到一個結果陣列,並對結果陣列進行迴圈獲取資料,並不需要在迴圈中執行查詢。
解決這個問題的最好方法就是閱讀函式文件並監控查詢語句是否出現 N+1 問題。

6.不要在 SQL 查詢中使用 *

在任何情況下,特別是資料庫中包含大量列時,如果可以避免使用萬用字元,則不要在 SQL 查詢語句中使用萬用字元。指明你想獲取的資料列,能最大限度地減少資源的使用,保護你的資料並使程式碼邏輯清晰。
在寫 SQL 語句時,儘量測試所有可能的實現並比較它們的速度。例如,使用 SQL 函式來計算平均值,總和而不是使用 PHP 函式來實現。

7.不要信任使用者的輸入

千萬不要相信任何使用者的輸入!對使用者所有的輸入你都需要過濾,轉義,檢查。使用者的輸入很有可能是某些居心莫測的人惡意輸入的帶有 SQL 注入,XSS 惡意攻擊的程式碼。
確保在使用資料庫時,使用像 filter_var() 這樣的內建函式來檢查以及轉義使用者輸入的值。

8.不要聰明反被聰明誤

你的目標應該是寫出優雅的程式碼,並清晰的表達你的意圖,而不是炫耀你寫程式碼的能力。你可以通過使用多級三元表示式或其他一些特別的技巧方法如通過將所有變數名變為單字母,從而使每個頁面的載入時間減少 0.01秒。但日後你的程式碼將使你和你的同事花費數倍的時間去理解和維護。
恰當的命名你的變數,為每一行必要的程式碼寫明註釋,使用清晰的邏輯和麵向物件方式書寫程式碼。今天你花費在這些上面 “不必要” 的時間,在將來必將節省你數倍的維護時間並使你倍加感恩。

9.不要造輪子

PHP 已經有很長的歷史了。在大多數情況下,你的需求往往都已經有人做出了實現。不要嘗試去造輪子,造輪子前請先在 Github,Composer,Packagist 上搜尋是否已經有相關的包。
從日誌記錄到取色器,從效能檢測到單元測試,從微信介面到簡訊傳送 API,只需要你閱讀這些包的文件並簡單的寫幾行程式碼就能完成需求,而不必大費周折自己寫一個輪子。

10.不要忽略其他語言

雖然你是一個 PHPer,但你至少也要了解HTML,CSS,Javascript和 MySQL 的基本知識。
我也建議你學習有關物件導向的知識,它會使你的程式碼更優雅更賦予表達力。它也會為你開啟學習 C#, Java 這類面嚮物件語言的大門。
學習包管理器,構建指令碼,Coffeescript,LESS,SASS,YAML,模板引擎和其他工具來擴大你的知識面。衷心推薦你看看其他框架,特別是Ruby on Rails。
當你對這些知識都比較熟悉,那你也可以考慮考慮學習Typescript,Rust,Kotlin,Golang。
你往往會認為學習一門其他語言沒有必要,這是因為在工作中用不到而且跳出了你的舒適區。但是每種語言都有它獨特的東西值得你學習,這些不同思維程式語言的碰撞會讓你對程式設計有更深的體會和感悟,並能讓你在日後的程式設計中迸發出不一樣的火花。所有頂尖 PHP 開發者絕對不會只熟悉 PHP 這一門語言。跳出你的舒適區,打破你的偏見,帶著開放的眼光去看看外面的程式設計世界。
(譯者注:這一點感受很深。PHPer 被黑的很慘的一個重要的原因就是很多 PHPer 基礎並不是很好,往往只侷限於PHP 這一門語言。建議大家有空多補補計算機相關基礎,並多學習學習其他語言。並不止是職業上的考慮,紮實的基礎和開闊的眼界往往能讓你寫出更好的程式碼。Laravel 這個框架也是作者借鑑了許多別的語言的精粹才寫成的。他山之石,可以攻玉,共勉之!)

相關文章