PHP类方法静态变量在子类对象间共享问题及版本差异疑问
类方法中静态变量在子类间的共享问题(PHP 8.0 vs 8.1)
我意外发现,在类的方法中使用静态变量实现简单缓存时,该静态变量的值会在该类的不同子类对象之间保留。请问这一特性在PHP 8.0到8.1之间是否发生了变化?
复现代码
class top{ public function cacheValue(){ static $cache; if (!isset($cache)) { $cache=get_class($this)."\n"; } return $cache; } } class child1 extends top{} class child2 extends top{} $a = new child1; $b = new child2; echo $a->cacheValue(); echo $b->cacheValue();
预期结果
child1 child2
实际结果
child1 child1
这个特性在PHP 8.0到8.1之间没有发生变化。
PHP中,类方法内的静态变量是绑定到方法本身的,而非调用该方法的子类或实例。也就是说,父类top的cacheValue()方法里的$cache静态变量,所有继承自top的子类(比如child1、child2)在调用这个方法时,都会共享同一个$cache实例。
当child1的实例$a首次调用cacheValue()时,$cache未被初始化,会被赋值为child1\n;后续child2的实例$b调用该方法时,$cache已经存在值,不会重新赋值,因此返回的依然是child1的类名。
这一行为是PHP类方法静态变量的固有特性,在PHP 8.0、8.1及更高版本中表现一致,并非版本更新导致的变化。
内容的提问来源于stack exchange,提问作者jdog
相关产品推荐
相关产品推荐

