2010-06-01 109 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.

相關問題