| 領域 | 推薦組件 | 安裝 |
| 數據庫抽象 | Doctrine DBAL / Laravel Database / Medoo | composer require doctrine/dbal |
| HTTP 客戶端 | Guzzle / Symfony HttpClient | composer require guzzlehttp/guzzle |
| 日志 | Monolog (PSR-3 標準) | composer require monolog/monolog |
| 緩存 | Symfony Cache / Stash | composer require symfony/cache |
| 驗證 | Symfony Validator / Respect/Validation | composer require symfony/validator |
| 模板 | Twig / Blade / Latte | composer require twig/twig |
| 命令行 | Symfony Console | composer require symfony/console |
2. 打造私有函數庫:五大必備通用工具
<?php
// 1. 通用數據庫操作(封裝 PDO,支持多驅動)
class DB { /* query(), find(), insert(), transaction() */ }
// 2. 變量調試神器(替代 var_dump,支持對象/數組/標量統一輸出)
function dump(mixed $var, bool $exit = false): void {
echo '<pre>'; var_dump($var); echo '</pre>';
if ($exit) exit;
}
// 3. 分級日志系統(ERROR/INFO/DEBUG,文件輪轉)
class Logger { /* log($level, $msg), setLevel(), rotate() */ }
// 4. 代碼執行計時器(微秒級,支持多計時器並行)
class Timer { /* start($name), stop($name), elapsed($name) */ }
// 5. SQL 慢查詢記錄裝飾器(自動記錄超閾值 SQL)
function queryWithProfiling(PDO $pdo, string $sql, array $params = []): PDOStatement {
$timer = new Timer(); $timer->start('sql');
$stmt = $pdo->prepare($sql); $stmt->execute($params);
$ms = $timer->stop('sql') * 1000;
if ($ms > 100) Logger::log('WARN', "Slow SQL ({$ms}ms): $sql");
return $stmt;
}
?>
鐵律二:編寫漂亮的代碼 —— 分層、包含文件管理、面向對象
1. 後台邏輯與前端展示徹底分離
- 後台:Service/Repository/DTO/Entity —— 穩定、可測、可復用
- 前端:Controller + Template (Twig/Blade) —— 變化快、專注輸出
- 控制器僅負責:請求解析 → 調用 Service → 選擇模板 → 傳遞數據 → 響應
2. 包含文件最佳實踐
- 用
composer autoload (PSR-4) 替代手動 include/require
- 條件包含用函數封裝:
load_template('header', ['title' => $title])
- 大文件懶加載:
if (!defined('LOADED_X')) { define('LOADED_X',1); /* code */ }
3. 面向對象設計原則落地
- SOLID:單一職責、開閉、里氏替換、接口隔離、依賴倒置
- 組合優於繼承:用 Strategy/Decorator/Composite 替代深層繼承樹
- 依賴注入容器:統一管理對象生命週期,解耦創建與使用
鐵律三:追求程序運行速度,而非編寫速度
| 優化點 | 錯誤做法 | 最佳做法 | 原理 |
| HTML 輸出 | 大量 echo "<div>...</div>"; | 跳出 PHP 標簽直接寫 HTML:?><div>...</div><?php | PHP 只解析一次,減少 echo 開銷 |
| 字符串替換 | ereg_replace()/preg_replace() | str_replace()(無正則需求時) | 無正則引擎開銷,快 5-10 倍 |
| 字符串定界 | 雙引號 "$var" | 單引號 '$var' 或 'str'.$var.'str' | 單引號不解析變量,解析器更快 |
| 數據庫查詢 | 多表 JOIN、子查詢濫用 | 拆分為多次簡單查詢、應用層組裝、適當冗余字段 | JOIN 指數級增長掃描行,應用層組裝可控 |
| 包含文件 | 循環中 require | 循環外 require_once 或 autoload | require 無條件重複編譯 |
| 輸出函數 | print | echo | echo 無返回值,語法結構非函數,微快 |
數據庫聯合查詢性能實測佐證
表 foo: 1000 行;表 big_foo: 1,000,000 行 (相當於 foo 自連接)
SELECT * FROM foo; → 0.03 秒
SELECT * FROM foo a, foo b; → 17.28 秒 (笛卡爾積)
SELECT * FROM foo a, foo b WHERE a.id=b.id; → 0.04 秒 (等值連接)
SELECT * FROM big_foo; → 25.39 秒
結論:小表自連接比大表單查還慢!業務層組裝遠優於複雜 JOIN。
總結:高手檢查清單
[ ] 新需求先搜 Packagist/awesome-php 有無成熟包
[ ] 通用邏輯已封裝入私有庫(DB/Log/Timer/Validator...)
[ ] 業務代碼零 HTML 字符串拼接,全模板渲染
[ ] 所有字符串默認單引號,僅插值用雙引號/Nowdoc
[ ] 關鍵 SQL 有索引、有 Explain、有慢查詢告警
[ ] 核心邏輯有單元測試、集成測試、靜態分析通過
[ ] 部署流程自動化(CI/CD)、回滾機制就緒
[ ] 監控覆蓋:QPS、延遲、錯誤率、慢查詢、隊列積壓
- 上一篇文章: PHP 多接口同名方法衝突解決方案:接口繼承菱形問題實戰
- 下一篇文章: PHP 封裝數據庫操作類:PDO 基礎封裝與最佳實踐模式
Copyright ©
程式碼之家 All Rights Reserved