php类中定义常量必须用const,不能用define();const需在类体顶层声明并赋标量值,访问用self::、static::或classname::,php 7.1+支持访问控制修饰符。

PHP类中定义常量必须用const,不能用define()
类内部无法调用define()——它只在全局作用域有效,且PHP会直接报Parse error: syntax error, unexpected 'define'。类常量只能用const关键字声明,且必须在声明时赋值,不支持表达式或函数调用(如const MAX = time();非法)。
常见错误现象:把const写在方法里、漏掉访问修饰符(其实const隐式为public,但不能显式加private或protected)、尝试在构造函数中初始化。
-
const声明必须在类体顶层,不能嵌套在方法或条件块中 - 值只能是标量(
int、float、string、bool)、null,或其它已定义的类常量(如self::OTHER) - PHP 7.1+ 支持
private const和protected const,但访问仍受限;老版本一律视为public
访问类常量要用self::、static::或ClassName::
不能用$this->,因为常量不属于实例,而是类本身。三者区别直接影响继承行为:
-
self::NAME—— 绑定到**当前编写代码的类**,不会随子类调用而改变 -
static::NAME—— 遵循后期静态绑定(LSB),指向**实际运行时调用的类**(适合继承场景) -
ClassName::NAME—— 显式指定类名,硬编码,灵活性差但语义明确
例如子类重写了同名常量,self::仍读父类值,static::才读子类值。没继承时三者效果一致,但习惯上优先用self::或static::,避免硬编码类名。
类常量不支持变量访问,也不能被unset()或修改
试图用$$name或constant("ClassName::{$var}")动态访问常量名,虽语法合法,但属于反模式:破坏可读性、绕过IDE提示、难以静态分析。更严重的是,一旦类名或常量名拼错,constant()返回false而非报错,容易埋下静默bug。
- 禁止对类常量赋值:
self::MODE = 'dev';→Fatal error: Cannot reassign auto-global constant -
unset(self::NAME)语法错误,类常量不可销毁 - 想实现“可配置常量”?改用
private static $config+ 只读getter,或依赖注入
PHP 8.2+ 引入readonly类常量?不,目前仍不支持
有人误以为readonly const是新特性,其实PHP至今(包括8.3)**不支持任何修饰符加在const前**(除public/private/protected外)。readonly仅适用于属性(public readonly int $id;),与常量无关。
真正要注意的是:类常量在编译期解析,而static属性在运行时初始化。如果需要延迟计算或依赖外部状态,别硬塞进const,选static属性配合get方法更稳妥。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











