| # | 規則 | 原理/說明 | 現代補充 |
|---|---|---|---|
| 1 | 字串用單引號 | 雙引號需解析變數,單引號直接輸出 | 差異微乎其微,優先考慮可讀性;Heredoc/Nowdoc 處理多行 |
| 2 | 靜態方法優先 | 無需實例化,調用開銷少約 4 倍 | 僅用於無狀態工具方法;有狀態服務用 DI 容器管理單例 |
| 3 | 陣列鍵名加引號 | $row['id'] 比 $row[id] 快 7 倍(避免常數查找) | PHP 8.1+ 已優化,但習慣加引號防止歧義 |
| 4 | echo 多參數輸出 | echo $a, $b 避免字串連接開銷 | 模板引擎/框架輸出通常已優化 |
| 5 | for 循環預計算上限 | 避免每次迴圈呼叫 count() | 優先用 foreach,JIT 下差異極小 |
| 6 | 釋放大變數 | unset($bigArray) 釋放記憶體 | 作用域結束自動回收;長腳本(CLI/Queue)需主動釋放 |
| 7 | 避免魔術方法 | __get/__set/__autoload 觸發開銷大 | Composer PSR-4 自動載入替代 __autoload |
| 8 | 少用 require_once | 檢查已載入檔案有開銷 | Composer ClassLoader 已優化,生產環境生成 classmap |
| 9 | 使用絕對路徑 include | 避免遍歷 include_path | Composer 自動載入無此問題 |
| 10 | $_SERVER['REQUEST_TIME'] 替代 time() | 請求開始時間已在超全域變數,免系統呼叫 | PHP 7+ hrtime() 提供高精度 |
| # | 規則 | 原理 |
|---|---|---|
| 11 | 字串替換用 str_replace 而非 preg_replace | 無正則引擎開銷 |
| 12 | strtr 比 str_replace 快 4 倍 | 單次掃描完成多字元映射 |
| 13 | 多條件用 switch 替代 if-elseif | Opcode 層面優化,跳轉表查找 |
| 14 | 禁用 @ 抑制錯誤 | 極大效能懲罰(修改錯誤處理流程) |
| 15 | 開啟 Apache mod_deflate / Nginx gzip | 傳輸體積減 70%+,網頁載入快 |
| 16 | 資料庫連線用盡即關,勿長連線 | 釋放連線池資源,避免睡眠連線佔用 |
| 17 | 減少錯誤訊息產生 | 異常/錯誤建立堆疊追蹤開銷大 |
| # | 規則 | 原理 |
|---|---|---|
| 18 | 區域變數遞增最快 | 編譯為 INC opcode,無符號表查找 |
| 19 | 全域變數遞增慢 2 倍 | 需查找全域符號表 |
| 20 | 物件屬性遞增慢 3 倍 | 需物件屬性查找 + 寫入屏障 |
| 21 | 未定義區域變數遞增慢 9-10 倍 | 觸發 E_NOTICE + 符號表插入 |
| 22 | 僅定義未使用的區域變數也有開銷 | 編譯期分配 CV 槽位 |
| 23 | 方法數量不影響調用效能 | 類別方法表為雜湊表,O(1) 查找 |
| 24 | 子類方法比父類快 | 繼承鏈查找:子類優先命中 |
| 25 | 空函數調用 ≈ 7-8 次區域變數遞增 | 函數調用開銷:棧幀建立/銷毀、參數處理 |
| # | 規則 | 說明 |
|---|---|---|
| 26 | 靜態頁面優於動態腳本 | Apache 解析 PHP 慢 2-10 倍;靜態化/SSG/快取為王道 |
| 27 | 啟用 OpCache(生產環境必開) | 免除編譯開銷,提升 25-100% 效能 |
| 28 | 資料快取:Redis/Memcached | 熱點資料記憶體級讀取,降低 DB 壓力 |
| 29 | 字串長度判斷用 isset($str{5}) 替代 strlen($str) < 5 | 語言結構 vs 函數調用;PHP 8+ 差異極小,可讀性優先 |
| 30 | 前置遞增 ++$i 比後置 $i++ 快 | 少一個暫存變數;現代引擎優化後差異可忽略 |
| 31 | 非必要勿過度 OOP | 方法調用、物件建立有開銷;程序式/函數式同樣優雅 |
| 32 | 資料結構優先用陣列 | 陣列是 PHP 核心優化對象,極度高效 |
| 33 | 函數單一職責,拒絕萬能函數 | 利於測試、複用、JIT 優化 |
| 34 | 重複代碼提煉為函數 | DRY 原則,減少維護成本 |
| # | 規則 | 說明 |
|---|---|---|
| 35 | 盡量用內建函數 | C 實現,效能遠超用戶代碼 |
| 36 | 極致效能寫 C 擴展 / FFI | 計算密集型任務(圖像處理、加密、解析) |
| 37 | Xdebug/Blackfire 分析效能瓶頸 | 數據驅動優化,而非猜測 |
| 38 | HTTP 壓縮:mod_deflate / gzip | 傳輸量降 80% |
| 39 | file_get_contents 替代 fopen/fread 系列 | 內部優化,單次系統呼叫 |
| 40 | 減少檔案 I/O | 快取檔案內容、用資料庫/Redis |
| 41 | SQL 優化:索引、EXPLAIN、避免 SELECT * | 資料庫通常是瓶頸 |
| 42 | 優先用內部函數,別重造輪子 | 如 array_column, array_key_first, str_contains (PHP 8) |
| 43 | 迴圈外定義大變數/物件 | 避免重複建構/解構 |
| 44 | 多維陣列避免深層嵌套迴圈 | 考慮 array_walk_recursive、生成器、重構資料結構 |
| 45 | 字串操作用內建函數,非正則 | strpos, substr, explode 遠快於 PCRE |
| 46 | foreach 效能優於 while/for | 專用 opcode,無索引運算 |
| 47 | 單引號字串(重申) | 見規則 1 |
| 48 | $i += 1 風格統一 | C 慣例,編譯一致 |
| 49 | 全域變數用畢 unset() | 釋放符號表槽位,利於 GC |
| 50 | 嚴格模式 declare(strict_types=1) | 減少隱性型別轉換,提早發現錯誤,JIT 優化更好 |
💡 黃金法則:過早優化是萬惡之源。先用 Profiler 找到真正瓶頸,再針對性優化。可讀性、可維護性、正確性永遠優先於微優化。