在php中是静态的,为什么两个类都使用一个缓存
我为我的模型创建父类,如下所示在php中是静态的,为什么两个类都使用一个缓存,php,oop,Php,Oop,我为我的模型创建父类,如下所示 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[
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,因为函数“load”使用静态缓存,并从函数A::findById(1)加载结果。为什么? 静态属性是继承的,如果要单独使用,请重新定义它们
class A extend Model { static $cache; }
class B extend Model { static $cache; }
另外,您试图做的是糟糕的OOP实践 这就是你如何用正确的方法来做的 这只是一个示例,您可以更改一些位,如
- 您可以将
移动到CacheFactory::createModelCache
Cache
- 您可以使用
而不是使用get\u class
abstract protected$name
- 您可以只创建静态数组而不是
classCache
静态,这不是你在OOP中编写代码的方式
从我的示例中,您可以看到唯一的静态
是一个带有缓存
对象和工厂方法的数组。这是您唯一需要全局存储的内容。静态属性是继承的,如果您想单独存储,请重新定义它们
class A extend Model { static $cache; }
class B extend Model { static $cache; }
另外,您试图做的是糟糕的OOP实践
这就是你如何用正确的方法来做的
这只是一个示例,您可以更改一些位,如
- 您可以将
CacheFactory::createModelCache
移动到Cache
- 您可以使用
get\u class
而不是使用abstract protected$name
- 您可以只创建静态数组而不是
Cache
class
但问题是-你只是不在任何地方使用静态,这不是你在OOP中编写代码的方式
从我的示例中,您可以看到唯一的静态
是一个带有缓存
对象和工厂方法的数组。这是您需要全局存储的唯一内容。通过访问静态类属性作为静态::$cache
告诉解释器使用用于调用方法的类的$cache
属性,而不是定义方法的类的属性
简单地说,当调用A::findById()
时,您希望findById()
使用A
的$cache
属性,而不是Model
的属性。对于A::load()
也是如此,对于B::findById()
和B::load()
也是如此
现在的问题是:A
和B
类是否自行声明静态属性$cache
?因为如果它们不声明此属性,则函数A::findById()
中$cache
前面的静态:
无法找到A::$cache
,而是使用模型::$cache
。对于B::findById()
也一样
解决问题的简单方法是在扩展模型的所有类中声明受保护的静态$cache
属性
正确的解决方案是不使用静态属性和方法。静态属性和方法不是OOP。它们是过程编程(和思维),伪装成OOP代码。难以理解和测试的代码。通过访问静态类属性作为静态::$cache
告诉解释器使用用于调用方法的类的$cache
属性,而不是定义方法的类的属性
简单地说,当调用A::findById()
时,您希望findById()
使用A
的$cache
属性,而不是Model
的属性。对于A::load()
也是如此,对于B::findById()
和B::load()
也是如此
现在的问题是:A
和B
类是否自行声明静态属性$cache
?因为如果它们不声明此属性,则函数A::findById()
中$cache
前面的静态:
无法找到A::$cache
,而是使用模型::$cache
。对于B::findById()
也一样
解决问题的简单方法是在扩展模型的所有类中声明受保护的静态$cache
属性
正确的解决方案是不使用静态属性和方法。静态属性和方法不是OOP。它们是过程编程(和思维),伪装成OOP代码。难以理解和测试的代码。可能重复的可能重复的可能重复的谢谢,我已经在您的答案中创建了类似的代码,但不明白,为什么php不创建受保护的静态$cache=[];在每个类中使用空value@ConorHolt为什么PHP要在派生类中创建$cache
?静态属性不是类成员,它们是具有时髦名称的全局变量(可能可见性有限)。@ConorHolt静态属性被继承谢谢,我已经在您的答案中创建了类似的属性,但不明白,为什么php不创建受保护的静态$cache=[];在每个类中使用空value@ConorHolt为什么PHP要在派生类中创建$cache
?静态属性不是类成员,它们是具有时髦名称的全局变量(可能可见性有限)。@ConorHolt静态属性被继承谢谢,我明白了!谢谢你,我明白了!