我想在我的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) {
}
是否可以在每个班级都没有声明的情况下这样做?
答案 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,你所要求的是不可能的。