PHP-Zend Framework-数据库表单例
作者:互联网
我发现自己在代码中这样做是为了“缓存”实例化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单例的副手注释,但没有实际示例.
我已经配置了元数据缓存.
>如何使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];
}
}
在引导程序中初始化管理器,并将其粘贴在注册表中.
然后:
<?PHP
//in a galaxy far, far, away
$dbtFoo = Zend_Registry::get('dbtMgr')->getTable('Foo');
因此,您可以延迟加载dbTable对象,并强制执行类似单例的行为.
如果愿意,可以通过各种方式使上述内容静态化.
标签:zend-db-table,singleton,zend-framework,php 来源: https://codeday.me/bug/20191210/2099444.html