統一編碼風格能大幅降低維護成本、提升團隊協作效率。本文整理業界通用的 PHP 編碼規範(PSR-12 為基準),涵蓋排版、命名、註解、SQL、架構等面向。
if (, foreach ($a = $b + $c;foo($bar)[$a, $b]、['key' => $val]function foo(int $bar): string?><?php 獨佔一行,後接空行| 類型 | 慣例 | 範例 |
|---|---|---|
| 類別/介面/特質 | StudlyCaps | UserService, LoggerInterface |
| 方法/函式 | camelCase | getUserById() |
| 變數/屬性/參數 | camelCase | $userName, $maxRetry |
| 常數 | SCREAMING_SNAKE_CASE | MAX_RETRY_COUNT |
| 私有/保護屬性 | 底線前綴 | _cache, _connection |
| 檔案名 | 類別名一致 | UserService.php |
禁用拼音命名:$yongHuMing ❌ → $userName ✅
<?php
/**
* 使用者服務類
*
* @package App\Services
* @author Team Name
* @since 2024-01-01
*/
/**
* 依 ID 取得使用者
*
* @param int $id 使用者 ID
* @return User|null 使用者物件,不存在回傳 null
* @throws UserNotFoundException 找不到時拋出(可選策略)
*/
public function getById(int $id): ?User
{
// ...
}
// 理由說明 放在程式碼上方$i++; // i 加 1// TODO: 支援多語系foreach 遍歷陣列switch 每個 case 以 break 結尾,或註解 // no breakelse if 寫成 elseif(單字){$var} 包裹變數$arr['key'] 而非 $arr[key]$a . ' ' . $b 兩側加空格try-catch 處理例外,避免 @ 抑制錯誤Exception 或 \DomainExceptionisset()/empty()/filter_var()try-finally 或 using 模式關閉連線/檔案SELECT, FROM, WHERESELECT ***\`users\`LIMIT 避免全表掃描# composer.json
"require-dev": {
"phpcs/php-cs-fixer": "^3.0",
"phpstan/phpstan": "^1.10",
"psalm/plugin-phpunit": "^0.16"
}
# 執行
./vendor/bin/php-cs-fixer fix --rules=@PSR12
./vendor/bin/phpstan analyse src
./vendor/bin/psalm --show-info=false