Я нахожусь в процессе обновления некоторых объектных моделей, чтобы кэшировать их данные в 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?