PHP 常量定義詳解:define vs const、魔術常量與最佳實踐
用戶定義常量規範
- 命名慣例:全大寫,底劃線分隔(如
MAX_SIZE)
- 作用域:全局可見
- 值類型:僅限標量(bool/int/float/string)
- 定義方式:
define('NAME', value) 或 const NAME = value(類內部)
- 無
$ 前綴
define() vs const 核心差異
| 特性 | define() | const |
| 解析階段 | 運行時 | 編譯時 |
| 命名靈活性 | 可用變量/表達式動態構建名稱 | 必須為靜態標識符 |
| 作用域 | 全局 | 類內部受訪問控制影響 |
| 命名空間 | 默認全局,需前綴 \ | 受當前命名空間約束 |
| 性能 | 略慢 | 略快(編譯時優化) |
| 類常量 | 不支持 | 原生支持 Class::CONST |
PHP 魔術常量(不區分大小寫)
| 常量 | 說明 |
__LINE__ | 當前行號,包含文件中按包含文件行號計算 |
__FILE__ | 完整路徑+文件名,符號鏈接已解析 |
__DIR__ | 文件所在目錄(PHP 5.3+) |
__FUNCTION__ | 函數名(區分大小寫) |
__CLASS__ | 類名(含命名空間,區分大小寫) |
__TRAIT__ | Trait 名(PHP 5.4+) |
__METHOD__ | 類方法名(含類名) |
__NAMESPACE__ | 當前命名空間名 |
C 語言宏(define)對比補充
文中提及的 C 語言 #define 為預處理器文本替換,無類型檢查,不分配內存;C++ const 有類型、有作用域、參與編譯優化。PHP 借鑑了術語但機制不同。
最佳實踐建議
- 優先使用
const:類常量、編譯時可確定的值,性能更好、IDE 支持更好。
- 動態名稱/運行時定義用
define():如根據配置生成常量名。
- 避免全局常量污染:善用類常量
Class::CONST 或命名空間 Namespace\CONST。
- 配置與代碼分離:業務配置值放入配置文件(.env/ini/json),而非硬編碼常量。