如何在单个进程中缓存类方法,实现跨实例复用执行结果?
实现跨实例的方法调用缓存
要让方法首次调用后,所有实例后续调用都不再执行初始处理,核心是用静态属性存储缓存状态——静态属性属于类本身,而非单个实例,所有实例共享这一份数据。
修改后的代码
class App { // 用静态属性存储共享的缓存状态 private static $cachedData = null; public function print() { if (self::$cachedData === null) { // 仅首次调用时执行初始化 self::$cachedData = "First time."; } else { self::$cachedData = "After first time."; } return self::$cachedData; } } $data = new App(); echo $data->print() . "<br>"; echo $data->print() . "<br>"; $data2 = new App(); echo $data2->print() . "<br>"; echo $data2->print() . "<br>";
执行结果
First time. After first time. After first time. After first time.
原理说明
- 将原来的实例属性
public $data替换为静态属性private static $cachedData,静态属性通过self::访问,所有实例共用这一个变量。 - 首次调用任意实例的
print()方法时,self::$cachedData为null,执行初始化赋值;后续无论哪个实例调用,self::$cachedData已存在值,直接进入else分支。
如果需要更复杂的缓存逻辑(比如缓存多组不同结果),可以将静态属性扩展为数组,存储键值对形式的缓存数据,但当前场景下单个静态变量已满足需求。
内容的提问来源于stack exchange,提问作者Russell
相关产品推荐
相关产品推荐

