令我惊讶的是,当在函数内部使用静态变量进行简单缓存时,静态值会保留在函数所在类的不同子类之间。
PHP8.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();
预期结果:
孩子1 孩子2
实际结果:
孩子1 孩子1
是的,这在 PHP 8.1 中发生了变化。来自迁移指南:
继承方法中静态变量的使用
当继承(但不重写)使用静态变量的方法时,继承的方法现在将与父方法共享静态变量。