3

Zend_Db_Tableモデルをインスタンス化するときに行われた作業を「キャッシュ」するために、コードでこれを行っていることに気付きました。

if (Zend_Registry::isRegistered('x_table')) {
    $x_table = Zend_Registry::get('x_table');
} else {
    $x_table = new Default_Model_DbTable_X;
    Zend_Registry::set('x_table', $x_table);
}

この方法はあまり DRY ではないことが気になり、今日、これを行うにはおそらくシングルトン パターンの方が優れていることに気付きました。問題は、シングルトン クラスを作成したことがないことです。Web 検索を行ったところ、シングルトンに関する率直なコメントがいくつか見つかりましZend_Db_Tableたが、実際の例はありませんでした。

既にメタデータ キャッシュを構成しています。

  1. Zend_Db_Tableモデルをシングルトンにするにはどうすればよいですか?
  2. 落とし穴や欠点はありますか?

編集:シングルトンが答えだと考える理由は、コードに次の呼び出しを単純に含めることができ、$x_table = new Default_Model_DbTable_X;存在する場合は単一のインスタンスが返されると思ったからです。これが可能であれば、私はその解決策を好みます。

4

1 に答える 1

3

賢明な場所で DbTables を管理しないのはなぜですか? 適切な場所がない場合は、DbTableManager クラスを作成します。何かのようなもの:

<?PHP
class DbTableMgr {

  protected $_tables;

  public function getTable($classname){
    if ( empty($this->_tables[$name]) ){
      //assuming some things about class names for the sake of brevity elsewhere...
      $classname = 'Default_Model_DbTable_',ucfirst(strtolower($classname));

      $this->_tables[$name] = new $classname; 
    }
    return $this->_tables[$name];  
  }
}

ブートストラップでマネージャーを初期化し、レジストリに貼り付けます。

それで:

<?PHP
//in a galaxy far, far, away
$dbtFoo = Zend_Registry::get('dbtMgr')->getTable('Foo');

したがって、dbTable オブジェクトを遅延ロードし、シングルトンのような動作を強制します。

必要に応じて、さまざまな方法で上記を静的にすることができます。

于 2010-04-14T22:34:47.590 に答える