Отдельная статическая переменная для каждого ребенка - PullRequest
0 голосов
/ 20 августа 2011

Я хочу сделать кеш в моем 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 Ответ

1 голос
/ 20 августа 2011

Если так важно, чтобы вы не объявляли свойство повторно в каждом дочернем классе, я могу придумать единственное решение, которое не совсем то, что вы хотели, но оно должно дать вам ту же функциональность, использование одного и того же свойства в базовом классе для хранения кэша для всех дочерних классов, но с использованием имени дочернего класса в качестве ключа в массиве кэша:

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, то, что вы просили, невозможно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...