有没有办法将对象反序列化为“$ this”?

时间:2010-06-01 20:04:07

标签: php oop memcached

我正在编写一个类来处理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(缓存对象);有没有办法做到这一点? “每个可缓存的对象都来自可缓存的类”是一个糟糕的设计理念吗?

3 个答案:

答案 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;