该用 const 还是 define() 取决于场景:全局作用域推荐 const;类中必须用 const;动态定义、大小写不敏感、表达式命名、运行时值需用 define();const 要求编译期可求值,性能更优。
define() 和 const 哪个该用?看场景选
全局作用域下两者都能用,但
更推荐;类中必须用
,
根本不支持类内定义。
需要在
或循环里动态决定是否定义常量?只能用
——
在条件块里直接报错:
要定义大小写不敏感的常量(比如兼容旧系统)?只有
支持,
永远大小写敏感
命名想用表达式拼接(如
)?
可行;
的名字必须是纯标识符,不能含点号、运算或变量
const 声明值有哪些硬限制?
的右边必须是「编译期可求值」的常量表达式,不能依赖运行时函数或变量。
❌ 报错:函数调用不允许
✅ 允许:纯数字运算
❌ 不行:超全局变量不是常量表达式
✅ PHP 5.6+ 支持数组字面量,但 PHP 5.5 及更早会报错
define() 的灵活性背后藏着什么代价?
是函数调用,每次执行都有函数开销;
是语言结构,解析阶段就固化,性能略优,也更容易被 OPcache 优化。
大量定义(比如配置文件里上百个常量)?优先用
,尤其在 Composer 自动加载的类文件中
需要运行时根据环境开关常量(如调试模式)?
是唯一选择,但注意它不支持重复定义——二次调用会触发
想检查常量是否存在再定义?得先用
判断,
没有等价的语法糖
类常量怎么访问?self:: 和 static:: 有区别吗?
类中只能用
,访问时用
或
。但要注意后期静态绑定:
PHP 8.5.5
PHP 8.5.5 是 PHP 8.5 分支的维护更新版本。该版本延续了“小步快跑”的迭代逻辑,通过深度错误修复、底层性能微调以及安全加固,旨在为开发者提供一个更健壮、更高效的运行环境。该版本严格遵守语义化版本规范,不包含破坏性变更。
下载
立即学习
“
PHP免费学习笔记(深入)
”;
绑定声明时的类,适合固定值逻辑(如状态码)
绑定运行时实际调用的类,适合被子类覆盖的场景(需配合
控制)
类常量默认 public,不可用
(PHP 7.1+ 才支持访问控制修饰符)
别忘了魔术常量如
和
是只读的,它们不是你定义的,但随时能拿过来用。
constconstdefine()ifdefine()constParse error: syntax error, unexpected 'const'define('FOO', 'bar', true)constBIT_5define('BIT_' . 5, 32)constconstconst NOW = time();const MAX = 100 * 2;const HOST = $_SERVER['HTTP_HOST'];const CONFIG = ['db' => 'mysql'];define()constconstdefine()Notice: Constant XXX already defineddefined('XXX')constconstClassName::CONST_NAMEself::CONST_NAMEself::static::finalprivate const__CLASS____METHOD__