You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 13:52:33