我为我的模型创建父类,它看起来像这样
class Model {
protected static $cache = [];
public static function load($id)
{
return static::$cache[$id];
}
public static function findById($id)
{
$model = static::find($id);
static::$cache[$id] = model;
return model;
}
...
}
我有两个孩子班,例子
class A extend Model {}
class B extend Model {}
然后,我写
A::findById(1);
B::findById(1);
$a = A::load(1);
$b = B::load(1);
我认为类 $b 的类型是 B 类,但不是,它是 A 类,因为函数“加载”使用静态缓存并从函数 A::findById(1) 加载结果。为什么?
通过访问静态类属性,static::$cache
告诉解释器使用$cache
用于调用方法的类的属性,而不是定义方法的类的属性。
用简单的英语,当你打电话A::findById()
,你想到的是findById()
使用该属性$cache
的A
,而不是一个Model
。同为A::load()
和类似的B::findById()
和B::load()
。
现在的问题是:A
和B
类是否$cache
自己声明了静态属性?因为如果他们不声明这个属性,函数static::
中的前面就找不到并使用了。对于.$cache
A::findById()
A::$cache
Model::$cache
B::findById()
解决您的问题的简单方法是protected static $cache
在所有扩展Model
.
正确的解决方案是不使用静态属性和方法。静态属性和方法不是 OOP。它们是伪装成 OOP 代码的过程编程(和思维)。难以理解和测试的代码。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句