代码之家  ›  专栏  ›  技术社区  ›  Andreas Bonini

是否有方法将对象反序列化为“$this”?

  •  3
  • Andreas Bonini  · 技术社区  · 15 年前

    我正在编写一个类来处理memcached对象。想法是创造 abstract class Cachable 所有可访问的对象(如用户、post等)都是该类的子类。

    该类提供了一些方法,例如 Load() 它调用抽象函数 LoadFromDB() 如果对象未缓存,则刷新/使缓存无效的函数等。

    主要问题在于 加载() 我想做类似的事情:

    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 回复  |  直到 15 年前
        1
  •  1
  •   Matt S    15 年前

    将属性从$cached复制到$this怎么样?

    foreach (get_object_vars($cached) as $field => $value) {
      $this->$field = $value;
    }
    
        2
  •  1
  •   symcbean    15 年前

    是否有方法将对象反序列化为_$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
    

    C.

        3
  •  0
  •   ircmaxell    15 年前

    您可以始终将其设置为静态方法(注意,仅限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;