我发现自己在我的代码中这样做是为了“缓存”在实例化我的 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,今天我突然意识到单例模式可能是执行此操作的更好方法。问题是,我从来没有写过单例类。当我进行一些网络搜索时,我发现了一些关于 Zend_Db_Table
单例的随意评论,但没有真正的例子。
我已经配置了元数据缓存。
- 如何使我的
Zend_Db_Table
模型成为单例? - 有陷阱或缺点吗?
编辑:我认为单例的原因是答案是我认为我可以简单地在我的代码中进行以下调用 $x_table = new Default_Model_DbTable_X;
和如果存在,将返回单个实例。如果可能的话,我更喜欢那个解决方案。
最佳答案
为什么不在一些合理的地方管理 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];
}
}
在您的 Bootstrap 中初始化管理器并将其粘贴到注册表中。
然后:
<?PHP
//in a galaxy far, far, away
$dbtFoo = Zend_Registry::get('dbtMgr')->getTable('Foo');
因此,您延迟加载 dbTable 对象,并强制执行类似单例的行为。
如果您愿意,可以通过多种方式使上述静态化。
关于php - Zend Framework - 数据库表单例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2641350/