2012-03-07 22 views
1

我想通過使用構造函數而不是一些工廠方法來使用透明(窮人)緩存對象。在構造函數中的php對象緩存

$a = new aClass();應檢查此對象是否存在於緩存中,如果不存在,請創建它並將其添加到緩存中。

一些僞代碼:

class aClass { 
    public function __construct($someId) { 
     if (is_cached($someId) { 
      $this = get_cached($someId); 
     } else { 
      // do stuff here 
      set_cached($someId, $this); 
     } 
    } 
} 

不幸的是,這是不可能的,因爲你不能在PHP重新定義$this

有什麼建議嗎?

+0

和工廠有什麼問題? – SergeS 2012-03-07 09:28:50

+0

首先,我想要透明度,其次我不想重寫數十萬行代碼。 – 2012-03-07 10:16:44

回答

3

這不會工作,因爲ctors不會返回並且您不能重新定義$this

您可以使用一個靜態工廠方法代替:

class Foo 
{ 
    protected static $instances = array(); 

    public function getCachedOrNew($id) 
    { 
     if (!isset(self::$instances[$id])) { 
      self::$instances[$id] = new self; 
     } 
     return self::$instances[$id]; 
    } 
} 

$foo = Foo::getCachedOrNew(1); 
$foo->bar = 1; 
$foo = Foo::getCachedOrNew(1); 
echo $foo->bar; // 1 

另一種方法是使用依賴注入容器(DIC),可以管理對象實例。看看這個The Symfony Componenent DIC.

+0

正如我所提到的,我不想使用工廠方法來創建對象,我想要透明緩存。但我看起來像這是不可能與PHP。 – 2012-03-07 09:37:55

+0

@BerndGoldschmidt權利。不可能。 – Gordon 2012-03-07 09:42:00