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

+0

最初に、私は透明度を求め、次に何十万行ものコードを書き直したくありません。 –

答えて

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で可能ではないように見えます。 –

+0

@BerndGoldschmidt right。不可能。 – Gordon

関連する問題