| 特性 | const | define() |
|---|---|---|
| 定義位置 | 類成員 / 全域(PHP 5.3+) | 僅全域,不可在類內部 |
| 條件式定義 | 不支援 if (...) { const A = 1; } 會報錯 | 支援 if (...) { define('A', 1); } |
| 名稱形式 | 靜態識別子 const FOO = 'BAR'; | 接受字串運算式 define('BIT_' . $i, 1 << $i); |
| 值的型態 | 僅靜態純量(數字、字串、布林、null) | 任意運算式 define('BIT_5', 1 << 5); |
| 大小寫敏感 | 永遠敏感 | 可選第三參數 define('FOO', 'BAR', true) 不敏感 |
| 編譯階段 | 編譯時期解析,效能略優 | 執行時期呼叫函數 |
| 命名空間影響 | 受目前命名空間影響 | 永遠定義在全域命名空間(除非加 \ 前綴) |
class Config {
const DB_HOST = 'localhost'; // 正確
// define('DB_HOST', 'localhost'); // 錯誤:不能在類中使用 define
}
for ($i = 0; $i < 32; ++$i) {
define('BIT_' . $i, 1 << $i); // 正確
// const 'BIT_' . $i = 1 << $i; // 語法錯誤
}
// const BIT_5 = 1 << 5; // PHP 5.6+ 允許純量運算式,但舊版不支援
define('BIT_5', 1 << 5); // 所有版本皆可
define('FOO', 'BAR', true);
echo FOO; // BAR
echo foo; // BAR
// const FOO = 'BAR'; // 永遠區分大小寫
const,語意清晰、效能佳、IDE 自動完成支援完整。const(PHP 5.3+);需動態名稱、運算式、或不敏感需求用 define()。const 支援可見性修飾詞(public const, protected const, private const),更應優先使用。const 是語言結構,編譯期解析,簡單易讀、效能優;define() 是函數,執行期動態定義,功能更靈活。根據場景選擇,現代 PHP 開發傾向盡量使用 const。