php - Zend Framework - 数据库表单例

标签 php zend-framework singleton zend-db-table

我发现自己在我的代码中这样做是为了“缓存”在实例化我的 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 单例的随意评论,但没有真正的例子。

我已经配置了元数据缓存。

  1. 如何使我的 Zend_Db_Table 模型成为单例?
  2. 有陷阱或缺点吗?

编辑:我认为单例的原因是答案是我认为我可以简单地在我的代码中进行以下调用 $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/

相关文章:

php - Doctrine2,按多对多属性的计数获取实体顺序

zend-framework - 这是检查 db_row 是否存在的有效方法吗?

apache - 虚拟主机不能在 zend 框架中工作

multithreading - 双重检查锁定的此修复程序有什么问题?

java - 关于单例设计模式

java - Java 中的线程安全多线程

php - 如何重写图像路径

php - 运算符 <=> 如何比较对象?

php - 使用 currancy 格式的字段将 CSV 导入 MYSQL

php - ZF2 读取 HTTP Cookie