定義常量的兩種方式
| 方式 | 語法 | 作用域 | 特點 |
define() | define('NAME', 'value', true) | 全局 | 運行時定義、可動態名稱、第三參數控制大小寫敏感(棄用) |
const | const NAME = 'value'; | 命名空間/類 | 編譯時定義、性能略快、支持數組(PHP 5.6+)、類常量必須用 const |
核心代碼示例
<?php
// 1. define() - 全局常量
define('APP_VERSION', '1.0.0');
define('DB_CONFIG', [
'host' => 'localhost',
'port' => 3306,
], false); // 大小寫敏感(推薦)
// 2. const - 命名空間/類常量
namespace App\Config;
const API_KEY = 'secret_key';
const ALLOWED_EXT = ['jpg', 'png', 'gif'];
class User {
const STATUS_ACTIVE = 1;
const STATUS_BANNED = 2;
// const 只能是標量/數組,不能是對象/資源
}
// 3. 使用
echo APP_VERSION; // 1.0.0
echo \App\Config\API_KEY; // secret_key
echo User::STATUS_ACTIVE; // 1
// 4. 動態獲取
$name = 'APP_VERSION';
echo constant($name); // 1.0.0
// 5. 判斷是否定義
if (defined('APP_VERSION')) { /* ... */ }
// 6. 獲取所有已定義常量
print_r(get_defined_constants(true)['user']); // 用戶定義常量
?>
魔術常量(編譯時解析,非真正常量)
| 常量 | 含義 | 示例輸出 |
__LINE__ | 當前行號 | 10 |
__FILE__ | 當前文件絕對路徑 | /var/www/index.php |
__DIR__ | 當前文件目錄(等同 dirname(__FILE__)) | /var/www |
__FUNCTION__ | 函數名 | myFunc |
__CLASS__ | 類名(含命名空間) | App\Model\User |
__TRAIT__ | Trait 名 | App\Traits\Loggable |
__METHOD__ | 類方法名 | App\Model\User::getName |
__NAMESPACE__ | 當前命名空間 | App\Model |
ClassName::class | 類完全限定名(PHP 5.5+) | App\Model\User |
預定義核心常量
<?php
PHP_VERSION; // '8.2.10'
PHP_OS; // 'Linux'
PHP_SAPI; // 'fpm-fcgi' / 'cli'
PHP_EOL; // 換行符(跨平台)
PHP_INT_MAX; // 最大整數
DEFAULT_INCLUDE_PATH;
PEAR_INSTALL_DIR;
// ... 更多見手冊
?>
最佳實踐與避坑
- 常量名規範:全大寫 + 下劃線
SNAKE_CASE(如 MAX_UPLOAD_SIZE)。
- 優先用
const:編譯時優化、IDE 支持更好、避免運行時拼接字符串名稱的錯誤。
- 配置類常量化:將陣列配置定義為
const,而非 define 返回陣列(PHP 5.6+ 支持)。
- 避免大小寫不敏感:
define('NAME', 'val', true) 已棄用,統一區分大小寫。
- 常量 vs 環境變量:敏感配置(DB 密碼、API Key)必須用環境變量(
getenv()/$_ENV),不要寫在代碼常量中。
- 類常量訪問:
self::CONST(當前類)、static::CONST(晚靜態綁定)、ParentClass::CONST。
結論
現代 PHP:類/命名空間用 const,全局極少數用 define()。善用魔術常量消除硬編碼路徑,配置外置環境變量,構建安全、可維護的應用。