PHP Memcache вызов в конструкторе - PullRequest
1 голос
/ 16 июня 2011

Я нахожусь в процессе обновления некоторых объектных моделей, чтобы кэшировать их данные в memcache, а затем вернуться к обычному старому sql-запросу, если ключ кеша не найден. Изначально конструкторы выглядят примерно так, хотя, конечно, упрощенно.

function __construct($id){
    $sql = 'SELECT name, place FROM Objs WHERE ObjID = ?';
    $params = array($id);
    $data = Database::GetRow($sql, $params);

    $this->name = $data['name'];
    $this->place = $data['place'];
}

Что я изменил на что-то вроде этого:

function __construct($id){
    $data = $Memcache->get('obj-'.$id);
    if(empty($data)){
        $sql = 'SELECT name, place FROM Objs WHERE ObjID = ?';
        $params = array($id);
        $data = Database::GetRow($sql, $params);
        $Memcache->set('obj-'.$id, $data, false, 350);
    }

    $this->name = $data['name'];
    $this->place = $data['place'];
}

Это все хорошо, но многие из объектов имеют другие частные методы, которые выполняют другие запросы и устанавливают больше атрибутов. То, что я хотел бы сделать, это вернуть объект из memcached полностью, свойства AFTER установлены. Проблема в том, что я не уверен, как это сделать, поскольку конструктор не может назначить ключевое слово $this.

function __construct($id){
    $data = $Memcache->get('obj-'.$id);
    if(empty($data)){
        $sql = 'SELECT name, place FROM Objs WHERE ObjID = ?';
        $params = array($id);
        $data = Database::GetRow($sql, $params);
        $this->name = $data['name'];
        $this->place = $data['place'];
        $Memcache->set('obj-'.$id, $data, false, 350);
    }else{
        //this is definitely not right, though semantically it kinda defines what I want to accomplish
        $this = $data
    }
}

Есть ли способ сохранить эту логику в конструкторе и каким-то образом изящно получить возражение, возвращаемое из memcached, "стать" экземпляром, который получает конструктор? Или мне нужно будет создать псевдоним конструктора внутри функции, которая сначала проверяет memcache?

...