我正在编写一个类来处理memcached对象。我的想法是创建abstract class Cachable
,所有可缓存的对象(如User,Post等)都是所述类的子类。
该类提供了一些方法,例如Load()
,如果没有缓存对象,则调用抽象函数LoadFromDB()
,刷新/使缓存无效的函数等等。
主要问题在Load()
;我想做类似的事情:
protected function Load($id)
{
$this->memcacheId = $id;
$this->Connect();
$cached = $this->memcache->get(get_class($this) . ':' . $id);
if($cached === false)
{
$this->SetLoaded(LoadFromDB($id));
UpdateCache();
} else {
$this = $cached;
$this->SetLoaded(true);
}
}
不幸的是,我需要$this
成为$cached
(缓存对象);有没有办法做到这一点? “每个可缓存的对象都来自可缓存的类”是一个糟糕的设计理念吗?
答案 0 :(得分:1)
如何将属性从$ cached复制到$ this呢?
foreach (get_object_vars($cached) as $field => $value) {
$this->$field = $value;
}
答案 1 :(得分:1)
有没有办法将对象反序列化为“$ this”?
据我所知(并且从阅读日期的答案),答案是否定的。
然而,编写一个几乎可以包装任何内容的装饰器对象是相当简单的....
class mydecorator {
var $mydec_real_obj;
function deserialize($inp)
{
$this->mydec_real_obj=unserialize($inp);
}
function __set($name, $val)
{
$this->mydec_real_obj->$name=$val;
}
function __call($method, $args)
{
return call_user_func_array(
array(0=>$this->mydec_real_obj, 1=>$method),
$args);
}
// ... etc
下进行。
答案 2 :(得分:0)
你总是可以把它变成一个静态方法(注意,仅适用于5.3+,否则由于后期的静态绑定问题,无法告诉调用类)...
protected static function Load($id) {
$memcache = Memcache::getInstance();
$cached = $memcache->get(get_called_class() . ':' . $id);
if($cached === false) {
$ret = new static();
$ret->SetLoaded(LoadFromDB($id));
UpdateCache();
} else {
$ret = $cached;
$ret->SetLoaded(true);
}
return $ret;
}
用法:
$user = User::load(4);
$user->foo;