为每个孩子分隔静态变量

时间:2011-08-20 08:39:07

标签: php oop caching orm

我想在我的ORM中做一些缓存

class Base {

    static public $v=array();
    static public function createById($id){
        if(!array_key_exists($id, static::$v)){
            static::$v[$id] = new static; //Get from DB here. new static is just example
        }
        return static::$v[$id];
    }

}

class User extends Base{

}
class Entity extends Base{

}

但现在缓存已合并

var_dump(User::createById(1));
var_dump(Entity::createById(1));

结果

object(Model\User)#4 (0) {
}
object(model\User)#4 (0) {
}

如果我做了

class Entity extends Base{
    static public $v=array();
}
class User extends Base{
    static public $v=array();
}

我得到了我需要的东西:

object(Model\User)#4 (0) {
}
object(model\Entity)#5 (0) {
}

是否可以在每个班级都没有声明的情况下这样做?

1 个答案:

答案 0 :(得分:1)

如果重要的是你没有在每个子类中重新声明属性,那么我能想到的唯一解决方案就是,这不是你想要的,但是它应该让你获得相同的功能,是在基类上共享相同的属性以存储所有子类的缓存,但使用子类名作为缓存数组中的键:

class Base {
   public static $v=array();
   public static function createById($id){
        $called = get_called_class();
        if (!isset(self::$v[$called])) {
            self::$v[$called] = array();
        }
        $class_cache = &self::$v[$called];
        if(!array_key_exists($id, $class_cache)){
            $class_cache[$id] = new static;
        }
        return $class_cache[$id];
    }
}

是的,它不漂亮......但AFAIK,你所要求的是不可能的。