PHP中静态属性和方法的“继承”实为共享引用而非复制,子类未重定义时共用父类内存地址;self::绑定定义类,static::支持后期静态绑定;private static不可继承访问。

PHP中静态属性和方法确实会被子类“继承”,但这个“继承”不是复制,而是共享引用——除非子类显式重定义同名静态成员。这点和Java等语言有本质区别,不理解会踩坑。
static属性在子类未重定义时是共享的
父类定义 public static $count = 0,子类 A 和 B 都没声明自己的 $count,那么 A::$count = 5 之后,B::$count 和 Parent::$count 全都会变成 5。这不是 bug,是 PHP 的设计事实。
- 所有未重写的子类,访问的都是父类那个内存地址上的值
- 哪怕只用
new A()创建实例,再通过A::$count++修改,也会影响整个继承链 - 这种共享在单例、计数器、配置缓存等场景容易引发意料外的副作用
self:: 和 static:: 在继承中行为完全不同
self:: 绑定到**方法定义处的类**,static:: 绑定到**实际调用时的类**(后期静态绑定,LSB)。这是理解静态继承表现的核心。
- 在父类方法里写
return self::$value,无论子类是否重写了$value,都返回父类的值 - 写
return static::$value,则子类重写后返回子类的值,没重写就回退到父类 - 如果子类重写了
$value(如protected static $value = 'child'),那它就和父类断开共享,变成独立副本
private static 成员不会被继承
private static 属于严格私有,子类无法访问,更谈不上继承。试图在子类中用 self:: 或 parent:: 访问父类的 private static 会报 Fatal error: Uncaught Error: Cannot access private property。
-
protected static可被子类访问,也能被static::解析到(前提是子类没重写) -
public static最开放,但也要小心跨子类误改 - 没有所谓的“继承 private 成员”,只有“不可见”
static方法的继承表现取决于调用方式
子类没重写 public static function foo() 时,Child::foo() 实际执行的是父类里的代码,$this 不可用,self:: 指向父类,static:: 指向 Child。
- 若方法内部用了
self::$x,结果永远来自父类,和调用者无关 - 若用了
static::$x,且子类重写了$x,就会取子类值;没重写就取父类值 - 子类重写该方法后,
self::和static::都指向子类(因为方法定义在子类)
最易忽略的一点:静态属性是否被“真正继承”,完全取决于子类有没有那一行 public static $xxx 声明。没有声明,就是共享;有声明,才是隔离。别靠直觉,看代码里有没有那行字。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











