douyongwan5946 2017-05-05 11:07
浏览 51
已采纳

静态在php中,为什么它为这两个类使用一个缓存

I create parent class for my models, it look like this

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;
   }

   ...
}

And i have two child class, examples

class A extend Model {}
class B extend Model {}

then, i write

A::findById(1);
B::findById(1);

$a = A::load(1);
$b = B::load(1);

I think type of class $b is class B, but not, it is class A, because function "load" use static cache and load result from function A::findById(1). Why?

  • 写回答

2条回答 默认 最新

  • douhao7889 2017-05-05 11:21
    关注

    By accessing static class properties as static::$cache you tell the interpreter to use the $cache property of the class used to call the method and not the one of the class where the method is defined.

    In plain English, when you call A::findById() you expect that findById() uses the property $cache of A and not the one of Model. The same for A::load() and similar for B::findById() and B::load().

    The question now is: do the A and B classes declare a static property $cache on their own? Because if they do not declare this property, the static:: in front of $cache in the function A::findById() cannot find A::$cache and uses Model::$cache instead. The same for B::findById().

    The easy solution to your problem is to declare the protected static $cache property in all classes that extend Model.

    The correct solution is to not use static properties and methods. Static properties and methods are not OOP. They are procedural programming (and thinking) disguised as OOP code. Code that is difficult to understand and test.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥100 set_link_state
  • ¥15 虚幻5 UE美术毛发渲染
  • ¥15 CVRP 图论 物流运输优化
  • ¥15 Tableau online 嵌入ppt失败
  • ¥100 支付宝网页转账系统不识别账号
  • ¥15 基于单片机的靶位控制系统
  • ¥15 真我手机蓝牙传输进度消息被关闭了,怎么打开?(关键词-消息通知)
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度