2012-03-07 43 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