::访问类常量无需实例化,因其属于类的静态结构,PHP类加载时即解析并存于符号表,运行时直接查表获取;它可访问public/protected/private const,但受访问控制限制,且不可用于非const属性。

不需要实例化,:: 访问类常量时完全不依赖对象实例。
为什么 :: 调用类常量不需实例?
因为类常量(const)属于类本身,存储在类的静态结构中,而非对象的堆内存里。PHP 在类加载时就解析并固定了这些常量值,运行时直接通过类名查符号表即可获取,跟有没有 new 出对象毫无关系。
这和 -> 访问实例属性/方法有本质区别:后者必须通过具体对象的 $this 指针定位数据,而 :: 是纯编译期绑定的静态查找。
:: 能访问哪些东西?
它能访问三类静态成员,但权限和语义不同:
立即学习“PHP免费学习笔记(深入)”;
-
self::CONST_NAME、static::CONST_NAME、ClassName::CONST_NAME都可安全访问public const -
private const只能在定义它的类内用self::或static::访问;外部即使通过子类也拿不到 -
protected const允许本类及子类访问,但不能用父类名显式调用(如ParentClass::CONST会报错)
常见错误:把 :: 当成 -> 用
典型误用是试图用 :: 访问实例属性或未声明为 const 的类属性:
class Foo {
public $prop = 'instance only';
public const MY_CONST = 'ok';
public function test() {
echo self::$prop; // ❌ 致命错误:Access to undeclared static property
echo self::MY_CONST; // ✅ 正确
}
}
另一个坑是混淆 self:: 和 static:: 的后期静态绑定行为——如果在继承链中调用,self:: 总指向当前代码所在类,而 static:: 指向实际运行时的类。
类常量的“零实例依赖”看似简单,但一旦混入 static 属性、self/static 语义、访问控制层级,就很容易掉进静态上下文错位的陷阱。











