寫出能跑的程式碼容易,寫出可維護、高效能、團隊協作友善的程式碼才是專業開發者的分水嶺。本文整理 9 個立竿見影的 PHP 開發習慣與技巧,涵蓋語法規範、除錯策略、程式碼組織與效能優化,助您快速提升程式碼品質。
<?php // 標準標籤,所有伺服器支援
// 避免使用縮略標籤 <? ?> 或 <%= %>,需啟用 short_open_tag 且可移植性差
理由:確保程式碼在任何 PHP 環境 (共享主機、Docker、CI/CD) 皆能正確解析,避免部署驚喜。
error_reporting 進行開發期除錯<?php
// 放在檔案第 2 行 (第 1 行通常是 <?php)
error_reporting(E_ALL);
ini_set('display_errors', '1'); // 開發環境顯示錯誤
// 生產環境建議:
// error_reporting(E_ALL & ~E_NOTICE & ~E_DEPRECATED);
// ini_set('display_errors', '0');
// ini_set('log_errors', '1');
// ini_set('error_log', '/var/log/php/error.log');
<?php
// 單行註解:說明邏輯、TODO、FIXME
# Shell 風格單行註解 (較少見)
/**
* 多行文件註解 (PHPDoc 標準)
* @param string $name 使用者名稱
* @return string 問候訊息
*/
function greet(string $name): string {
return "Hello, $name";
}
建議:所有公開函式/類別/方法必須撰寫 PHPDoc,IDE 可自動提示、靜態分析工具可檢查型別一致性。
<?php
// 設定編輯器:4 空格縮排、UTF-8 無 BOM、Unix 換行 (LF)
if ($condition) {
doSomething();
} else {
doOtherThing();
}
// 陣列簡短語法 (PHP 5.4+)
$arr = ['a' => 1, 'b' => 2];
推薦工具:PHP_CodeSniffer (phpcs) + PHP-CS-Fixer 自動修正,整合至 Git Hook 或 CI 流程。
<?php
$file = __DIR__ . '/layout.inc.php';
if (!file_exists($file)) {
exit('Error: Layout file missing');
}
include_once $file; // 防止重複包含導致函式重複定義錯誤
<?php
// 錯誤寫法:失敗靜默
mysqli_query($link, "INSERT INTO users (name) VALUES ('John')");
// 正確寫法:檢查錯誤並記錄
$sql = "INSERT INTO users (name) VALUES (?)";
$stmt = mysqli_prepare($link, $sql);
mysqli_stmt_bind_param($stmt, 's', $name);
if (!mysqli_stmt_execute($stmt)) {
error_log('DB Error: ' . mysqli_stmt_error($stmt));
// 回應使用者友善訊息,不洩露 SQL 細節
}
進階:使用 PDO + 例外模式 + 交易控制,封裝 Repository 層統一處理錯誤。
<?php
// 冗長寫法
if (empty($_POST['name'])) { exit('欄位不可空白'); }
if (empty($_POST['email'])) { exit('欄位不可空白'); }
// 精簡寫法:守衛子句
if (empty($_POST['name']) || empty($_POST['email'])) {
exit('請填寫所有必填欄位');
}
// 更進階:驗證類別集中處理
$validator = new Validator($_POST);
$validator->required(['name', 'email', 'password'])
->email('email')
->minLength('password', 8);
if (!$validator->passes()) {
exit($validator->errors()->first());
}
echo 而非 print| 特性 | echo | print |
|---|---|---|
| 速度 | 略快 (無返回值) | 較慢 (返回 1) |
| 多參數 | 支援 echo 'a', 'b', 'c'; | 僅單一參數 |
| 運算式語境 | 不可用於運算式 | 可用於運算式 $x = print 'hi'; |
實務上差異微小,但 echo 更符合「輸出」語意,且支援多參數避免字串連接開銷。
<?php
$title = '歡迎頁面';
$content = '這是動態內容';
// Heredoc: 解析變數 (雙引號語意)
echo <<<HTML
<!DOCTYPE html>
<html>
<head><title>$title</title></head>
<body>
<h1>$title</h1>
<div>$content</div>
</body>
</html>
HTML;
// Nowdoc: 不解析變數 (單引號語意) - PHP 5.3+
echo <<<'HTML'
... 靜態模板內容 ...
HTML;
優點:避免大量 echo 字串連接、保持 HTML 結構可讀、IDE 支援語法高亮。
| 技巧 | 核心價值 | 工具支援 |
|---|---|---|
| 標準標籤 | 可移植性 | 編輯器預設 |
| 錯誤報告 | 快速定位問題 | Xdebug, PHPStan |
| PHPDoc 註解 | 團隊協作、靜態分析 | IDE, Psalm, PHPStan |
| PSR-12 風格 | 一致性、可讀性 | PHP-CS-Fixer, phpcs |
| 安全包含 | 穩健性 | 自動載入器 |
| DB 錯誤處理 | 資料完整性、安全性 | PDO, Doctrine, Eloquent |
| 守衛子句 | 降低認知複雜度 | 重構技巧 |
| echo 多參數 | 微效能、語意清晰 | 習慣 |
| Heredoc 模板 | 前後端分離雛形 | 模板引擎 |
這 9 個技巧不需引入新框架、新工具,只要調整日常編碼習慣即可落實。建議團隊建立「程式碼審查清單」納入這些項目,並配合自動化工具 (PHP-CS-Fixer, PHPStan, Psalm) 在提交前自動檢查,讓好習慣成為團隊預設文化。