该用 const 还是 define() 取决于场景:全局作用域推荐 const;类中必须用 const;动态定义、大小写不敏感、表达式命名、运行时值需用 define();const 要求编译期可求值,性能更优。

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











