「命名是程式設計的核心」。良好的命名能讓代碼自我描述、降低認知負荷、減少文檔依賴。本文綜合 PEAR、Zend Framework、PSR-1/12、Google PHP Style Guide,制定一套落地可執行的 PHP 命名與風格規範,涵蓋類別、介面、Trait、方法、屬性、變數、常數、錯誤處理、大括號風格,並說明每條規則的理由與 IDE 配置建議。
| 元素 | 規範 | 範例 | 理由 |
|---|---|---|---|
| 類別 | StudlyCaps (大駝峰),名詞或名詞短語 | UserService, OrderProcessor | 區別於函數/變數,語意清晰 |
| 介面 | StudlyCaps + Interface 後綴 | LoggerInterface, CacheableInterface | 一眼識別為契約,實現類去掉後綴 |
| Trait | StudlyCaps + Trait 後綴 | LoggableTrait, SerializableTrait | 避免與類別混淆,明確標識復用單元 |
| 抽象類 | StudlyCaps + Abstract 前綴 (可選) | AbstractController | 語意上區別於具體實現 |
| 異常類 | StudlyCaps + Exception 後綴 | ValidationException | 符合 SPL 慣例,catch 時語意明確 |
camelCase (小駝峰),動詞或動詞短語開頭。get:取得值 (輕量、無副作用)set:設定值has/is/can:布林查詢find:查詢單筆 (可能不存在)search/filter:查詢集合create/build/make:建立新物件process/handle/execute:執行複雜流程to:轉換表示 (如 toArray())getUserById(), isEmailValid(), createOrderFromCart(), handlePaymentCallback()。| 類型 | 慣例 | 範例 | 備註 |
|---|---|---|---|
| 實例屬性 | camelCase | $userName, $dbConnection | PSR-12 不建議底線前綴 |
| 靜態屬性 | camelCase | static $instanceCount | |
| 區域變數 | camelCase | $totalAmount, $userList | |
| 函數參數 | camelCase | function calc($basePrice, $discountRate) | |
| 布林變數 | camelCase,建議 is/has/can 開頭 | $isActive, $hasPermission | 增強可讀性 |
| 陣列變數 | camelCase,複數形式 | $users, $orderItems | 暗示為集合 |
SNAKE_UPPER_CASE。const、define()、global 常數、類別常數。MAX_RETRY_COUNT, DEFAULT_PAGE_SIZE, DB_TABLE_PREFIX, self::STATUS_ACTIVE。fopen, curl_exec, json_decode 等)。false/null 讓調用者猜測。
$fp = fopen($path, 'rb');
if ($fp === false) {
throw new RuntimeException("無法開啟檔案: $path");
}
gettext 國際化,避免硬編碼字串散落。採用 **K&R 風格 (One True Brace Style)**:
<?php
if ($condition) {
// ...
} elseif ($other) {
// ...
} else {
// ...
}
function foo($bar) {
// ...
}
class Foo {
public function bar() {
// ...
}
}
try {
// ...
} catch (Exception $e) {
// ...
}
特例:匿名函數作為參數時,為閱讀性可將左括號換行:
usort($arr, function ($a, $b) {
return $a <=> $b;
});
.php-cs-fixer.dist.php 強制執行上述規則,CI 阻擋不合規提交。PHP CS Fixer 擴展存檔自動格式化。php-cs-fixer fix --diff。命名與風格規範不是為了「好看」,而是為了**降低溝通成本、讓錯誤無處遁形、讓新成員半天上手**。建議團隊以本文為藍本,結合專案實況微調,寫入《團隊編碼規範》,納入 CI 強制執行。記住:**一致性大於完美**,統一的風格比個人偏好的「完美風格」更有價值。