Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在php中是静态的,为什么两个类都使用一个缓存_Php_Oop - Fatal编程技术网

在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
  • 您可以只创建静态数组而不是
    Cache
    class
但问题是-你只是不在任何地方使用
静态
,这不是你在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静态属性被继承谢谢,我明白了!谢谢你,我明白了!