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);
}

困扰我的是这种方法不是很干燥,今天我突然意识到单例模式可能是一种更好的方法。问题是,我从来没有写过单例类。当我进行一些网络搜索时,我发现了一些关于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 回答