常量 vs 變量:核心差異
| 特性 | 常量 | 變量 |
| 定義後可修改 | ❌ 不可變 | ✅ 可變 |
| 名稱前綴 | 無 $ 符號 | 需 $ 符號 |
| 作用域 | 全局可訪問(跨函數/類/文件) | 受作用域限制 |
| 值類型 | 標量(int/float/string/bool)+ PHP 7+ 數組 | 任意類型 |
| 定義方式 | define() / const | 賦值操作 |
define() 完整語法
bool define(string $name, mixed $value, bool $case_insensitive = false)
參數詳解
$name:常量名稱,慣例全大寫(如 MAX_SIZE)
$value:常量值,PHP 7.0+ 支持數組
$case_insensitive:true 不區分大小寫,false(默認)區分
代碼示例
示例 1:區分大小寫(默認)
define('GREETING', 'Hello you! How are you today?');
echo constant('GREETING'); // Hello you! How are you today?
echo GREETING; // 直接使用
// echo greeting; // 錯誤:未定義常量
示例 2:不區分大小寫
define('GREETING', 'Hello you! How are you today?', true);
echo constant('greeting'); // Hello you! How are you today?
echo GREETING; // 同樣可用
echo Greeting; // 同樣可用
示例 3:陣列常量(PHP 7.0+)
define('ALLOWED_EXT', ['jpg', 'png', 'gif', 'webp']);
echo ALLOWED_EXT[0]; // jpg
in_array('pdf', ALLOWED_EXT); // false
defined() 存在性檢測
bool defined(string $name)
- 返回
true(存在)或 false(不存在)
- 不區分大小寫參數:檢測時需與定義時一致(區分大小寫常量需精確名稱)
代碼示例
define('GREETING', 'Hello');
var_dump(defined('GREETING')); // bool(true)
var_dump(defined('GREETING2')); // bool(false)
// 條件定義模式
if (!defined('CONFIG_LOADED')) {
define('CONFIG_LOADED', true);
// 載入配置...
}
const 關鍵字 vs define()
| 特性 | const | define() |
| 定義時機 | 編譯時 | 運行時 |
| 命名空間 | 受命名空間影響 | 全局命名空間(除非在命名空間中定義) |
| 值類型 | 標量/數組(PHP 7+) | 標量/數組(PHP 7+) |
| 大小寫不敏感 | ❌ 不支持 | ✅ 第三參數控制 |
| 條件定義 | ❌ 不可在 if 中 | ✅ 可動態定義 |
| 類常量 | ✅ 支持 | ❌ 不支持 |
最佳實踐建議
- 配置類常量優先用 const(編譯時優化、IDE 提示、命名空間隔離)
- 運行時動態定義、需大小寫不敏感、跨文件全局共享用 define()
- 常量命名: 全大寫 + 下劃線分隔(
DB_MAX_CONNECTIONS)
- 避免魔術數字: 所有業務閾值、狀態碼、配置參數常量化
- PHP 8.1+: 可用
define('CONST', value, true) 但官方建議統一區分大小寫
常見陷阱
defined('MY_CONST') 檢測不存在時返回 false,但直接使用未定義常量會觸發 Warning 並被視為字符串 'MY_CONST'
- 類常量
Class::CONST 需用 defined('Class::CONST') 檢測
- 命名空間下
define() 會注入全局空間,推薦 const 或 define(__NAMESPACE__ . '\CONST', value)