| 特性 | const | define() |
|---|---|---|
| 定義位置 | 類內部(PHP 5.3+ 也可類外) | 任何位置(類外) |
| 類內定義 | 支援 | **不支援** |
| 訪問方式 | Class::CONST 或 CONST (類外) | CONSTANT_NAME |
| 條件定義 | **不支援**(編譯時) | 支援(運行時) |
| 表達式值 | **不支援**(僅靜態標量) | 支援任意表達式 |
| 大小寫敏感 | 永遠敏感 | 可選(第3參數) |
| 性能 | 編譯時解析,**更快** | 運行時函數調用 |
| 命名空間 | 受命名空間約束 | 全局,除非前綴 \ |
// 類內:只能用 const
class Config {
const DB_HOST = 'localhost';
// define('DB_HOST', 'localhost'); // Fatal error
}
// 類外:PHP 5.3+ 兩者皆可
const APP_VERSION = '1.0.0';
define('APP_DEBUG', true);
// const 不能在 if 中
if ($env === 'prod') {
const DEBUG = false; // Parse error
}
// define 可以
if ($env === 'prod') {
define('DEBUG', false); // 正常
}
// const 僅接受靜態標量
const BIT_MASK = 1 << 5; // Parse error (PHP 5.6+ 支援常量表達式)
const PATH = __DIR__ . '/config'; // Parse error
// define 接受任意表達式
define('BIT_MASK', 1 << 5);
define('PATH', __DIR__ . '/config');
define('DYNAMIC', someFunction());
註:PHP 5.6+ const 支援常量表達式(如 1 << 5),但仍不支援函數調用。
define('TEST', 'value', true); // 第3參數 true = 不區分大小寫
echo test; // 輸出 value
echo TEST; // 輸出 value
const TEST2 = 'value';
echo test2; // Parse error
echo TEST2; // 正常
namespace App\Config;
const API_KEY = 'abc'; // 實際名稱:App\Config\API_KEY
define('API_KEY', 'abc'); // 實際名稱:API_KEY(全局)
define('\App\Config\API_KEY', 'abc'); // 顯式指定命名空間
$iterations = 1000000;
$t = microtime(true);
for ($i=0; $i<$iterations; $i++) define('CONST_' . $i, $i);
echo 'define: ' . (microtime(true) - $t) . "s\n"; // ~0.45s
$t = microtime(true);
for ($i=0; $i<$iterations; $i++) eval('const CONST_' . $i . ' = ' . $i . ';');
echo 'const (eval): ' . (microtime(true) - $t) . "s\n"; // ~2.1s (eval 開銷)
// 實際項目中 const 直接寫在代碼,編譯時解析,零運行時開銷
結論:const 編譯時解析,無運行時開銷;define() 需函數調用。大量常量定義時 const 顯著更快。
| 場景 | 推薦 | 理由 |
|---|---|---|
| 類常量(配置、狀態碼) | const | 語義清晰、受類約束、編譯時優化 |
| 全局應用配置 | const (PHP 5.3+) | 命名空間隔離、性能優 |
| 動態/條件定義 | define() | 運行時靈活決定 |
| 表達式計算值 | define() | 支援任意表達式 |
| 不區分大小寫需求 | define(..., true) | const 不支援 |
| 第三方庫兼容 | define() | 全局可訪問 |
const 只能在類內用。事實:PHP 5.3+ 類外可用define 可以在類內用。事實:會報 Fatal errorconst 支援函數調用。事實:不支援(PHP 8.1+ 仍不支援)優先使用 const**:語法更清晰、性能更好、受命名空間管理、IDE 支援更好。僅在需要動態定義、表達式計算、大小寫不敏感或類內部定義時使用 define()。