数据库
首页 > 数据库> > PHP-Zend Framework-数据库表单例

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