应优先使用const而非define():const更安全清晰,适用于全局作用域和类中,支持命名空间隔离;define()仅用于需运行时动态定义或兼容旧版PHP的场景。

新手写PHP常量,第一反应往往是define(),但其实绝大多数情况该用const——它更安全、更清晰、也更现代。关键不是“哪个更好”,而是“什么时候不能用哪个”。
const不能出现在条件块或函数里,否则直接报错
const是编译期语言结构,PHP在解析代码时就必须知道它存在。所以它只能写在文件最外层(全局作用域)或类定义内部。
-
非法写法(解析阶段就失败):
if (true) { const DEBUG = true; }→Fatal error: Constant expression contains invalid operations -
非法写法:
function init() { const VERSION = '1.0'; }→Parse error: syntax error -
合法写法:
define('DEBUG', true)可以放在任意运行时位置,包括if、foreach、函数体里
命名空间和类中必须用const,define会“逃出”作用域
在namespace App;里用const DB_PORT = 3306;,注册的是App\DB_PORT;而define('DB_PORT', 3306)注册的永远是全局DB_PORT,跟命名空间无关。
- 类中定义常量?
class Config { const TTL = 3600; }✅|define('TTL', 3600)❌(语法错误) - 想在命名空间下模拟“带前缀”的常量?
define('App\Config\ROOT', __DIR__);可行,但use const App\Config\ROOT仍无法导入——因为define不参与命名空间解析 - 多包共存时,不同 Composer 包都
define('VERSION', ...),极易冲突;const天然隔离,互不影响
值和名称的灵活性:const要“一眼能算清”,define靠“运行时不翻车”
const右边必须是编译期可确定的表达式;define只要执行时能得出结果就行。
立即学习“PHP免费学习笔记(深入)”;
-
const ROOT = __DIR__;✅(__DIR__是编译期常量) -
const ROOT = dirname(__FILE__);❌(函数调用,编译器不认) -
define('CACHE_DIR', sys_get_temp_dir() . '/cache');✅(运行时拼接没问题) -
for ($i = 0; $i < 3; $i++) { define("ITEM_{$i}", $i); }✅(动态生成常量名,const完全不支持)
大小写与调试体验:const更“友好”,define更“自由”
const定义的常量固定大小写敏感;define第三个参数可设为true启用不区分大小写模式。
-
define('ENV', 'dev', true); echo env;✅(小写也能访问) -
const ENV = 'dev'; echo env;❌(Notice: Use of undefined constant) - IDE 和 Xdebug 对
const支持更好:能跳转、能提示、断点里直接看到值;define注册的常量往往只在运行时可见,查起来更费劲 - PHP 5.6+ 开始,
const已支持数组和简单表达式,兼容性足够;除非项目还要支持 PHP 5.5 或更早,否则没理由回避const



















