核心差異速查表
| 特性 | const | define() |
| 定義位置 | 類內部 (類常量) 或命名空間頂層 | 任意位置 (全局常量) |
| 類中使用 | ✅ 支持 class A { const X = 1; } | ❌ 不支持類內定義 |
| 條件定義 | ❌ 不可在 if 中定義 | ✅ 運行時動態定義 |
| 名稱靈活性 | 固定標識符 | 可用表達式構建名稱 define('BIT_'.$i, 1<<$i) |
| 值類型 | 僅標量/常量表達式 (PHP 5.6+ 支持表達式) | 任意表達式結果 |
| 大小寫敏感 | 始終敏感 | 可選第三參數 true 不敏感 |
| 性能 | 編譯期綁定,極快 | 運行期查找,稍慢 |
| 本質 | 語言結構 | 函數 |
代碼示例
1. 類常量只能用 const
class Config {
const DB_HOST = 'localhost'; // 正確
// define('DB_HOST', 'localhost'); // Fatal error
}
echo Config::DB_HOST;
2. 動態常量名需用 define
for ($i = 0; $i < 32; $i++) {
define('BIT_' . $i, 1 << $i); // 批量生成 BIT_0...BIT_31
}
// const BIT_5 = 1 << 5; // PHP 5.6+ 允許,但無法動態生成名稱
3. 條件定義
if ($debug) {
// const DEBUG = true; // Parse error
define('DEBUG', true); // 正確
}
4. 大小寫不敏感
define('FOO', 'BAR', true);
echo FOO; // BAR
echo foo; // BAR (不敏感)
// const FOO = 'BAR'; // 嚴格區分大小寫
5. 表達式作為值
// const BIT_5 = 1 << 5; // PHP 5.6+ 支持,舊版報錯
define('BIT_5', 1 << 5); // 所有版本通用
性能微基測 (PHP 8.1, 10^7 次循環)
// const 讀取 ~0.08 秒
// define 讀取 ~0.12 秒
// 差異微乎其微,實際項目中可忽略
最佳實踐建議
- 類常量、接口常量、枚舉值 → 必須用
const。
- 全局配置、功能開關、運行時計算出的常量 → 用
define()。
- 需要大小寫不敏感 (極少見) →
define('NAME', 'VAL', true)。
- 代碼風格統一:團隊規範推薦「能用 const 就用 const」,語義更清晰、IDE 支持更好、編譯期優化。
- 避免濫用全局常量:優先考慮類常量、配置文件、環境變量、依賴注入容器。
命名規範 (PSR-1 / PSR-12)
- 常量全大寫下劃線:
MAX_RETRY_COUNT, DEFAULT_TIMEOUT
- 類常量同樣:
class Config { const API_VERSION = 'v1'; }