静态属性属于类本身,必须用::访问而非->,因->仅适用于实例上下文;::是作用域解析操作符,用于访问static属性、方法、const及父类成员,语法上静态属性需带$,如myclass::$cache。

静态属性不是对象成员,不能用 -> 访问
因为 $this 不存在,-> 操作符只在有实例上下文时才有效。静态属性属于类本身,不依附于任何对象,PHP 必须用另一种语法来区分“类级访问”和“实例级访问”。:: 就是这个专用通道——它不依赖对象,直接在类作用域内寻址。
常见错误现象:$obj->count 报 Fatal error: Uncaught Error: Access to undeclared static property,哪怕 $count 确实声明为 public static $count。原因不是属性没定义,而是 -> 根本不查静态区。
双冒号 :: 是作用域解析操作符,不是“简写”或“可选语法”
:: 的设计目标就是明确表达“我要访问的是类作用域里的东西”,包括:static 属性、static 方法、const 常量、父类被重写的成员。它和 -> 在底层实现、语义、运行时行为上完全不同。
使用场景举例:
- 读取配置常量:
Config::DB_HOST - 修改计数器:
Counter::$total++ - 调用工具方法:
StringUtils::slugify($str)
注意:-> 后面接变量名不加 $(如 $obj->name),而 :: 访问静态属性必须带 $(MyClass::$cache),这是硬性语法要求,漏掉就报错。
self:: / static:: / 类名:: 在内部调用时的区别很关键
在类内部访问自己的静态属性,不能写死类名(比如 MyClass::$data),否则继承后子类调用会指向父类,破坏多态。
推荐做法:
- 用
self::$data:编译时绑定,始终指向定义该代码的类(适合本类私有静态资源) - 用
static::$data:运行时绑定(后期静态绑定),指向实际调用的类(适合希望子类覆盖行为的场景) - 避免
MyClass::$data:硬编码类名,失去继承灵活性
错误示例:self::getData() 返回的是当前类的 getData,但若子类重写了它,static::getData() 才会真正调到子类版本。
类没加载、权限不对或拼写错误时,:: 不会静默失败
它会立刻暴露问题:
- 类名写错或未
use/require:报Class 'XXX' not found - 访问
private static成员:报Access level to XXX::$y must be public - 拼错静态属性名:
MyClass::$counnt→Notice: Undefined property(如果 error_reporting 开了)
最容易被忽略的一点:静态属性初始化时机。它在类首次被引用(比如第一次 MyClass::$x)时触发,而不是脚本启动时。如果依赖它做早期配置,得确认调用顺序,否则可能拿到 null 或默认值。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











