我正在更新一些对象模型以将它们的数据缓存到 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 中完整返回对象,设置属性后。问题是,我不知道该怎么做,因为构造函数不能分配$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 返回的对象“成为”构造函数接收的实例?或者我是否需要在首先检查内存缓存的函数中为构造函数起别名?