2010-06-01 72 views
3

我在写一个类来处理一个memcached对象。这个想法是创建abstract class Cachable和所有可缓存的对象(如用户,发布等)将是所述类的子类。

类提供了一些方法,例如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

不应该“被缓存”是一个接口,而不是一个抽象类?为什么你不能使用'__sleep()'和'__wakeup()'魔术函数,或者实现'Serializable'接口? – 2010-06-01 22:04:58

+0

@Byron:它不能实现,因为接口不能实现功能。在这种情况下,我不明白__sleep/__ wakeup如何帮助我。 – 2010-06-02 15:54:13

回答

1

如何复制从$缓存到$这种替代性?

foreach (get_object_vars($cached) as $field => $value) { 
    $this->$field = $value; 
} 
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; 
1

有没有办法来反序列化对象为“$这个”?

据我所知(从阅读答案到日期),答案是否定的。

但是它会是相当琐碎写一个装饰对象,将环绕任何事情....

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.

相关问题