这直接出自 Zend 快速入门指南。我的问题是:你为什么需要 setDbTable()
方法当getDbTable()
方法分配一个默认值 Zend_Db_Table
目的?如果您知道此映射器使用特定表,为什么还要通过 setDbTable()
提供可能使用“错误”表的可能性? ?如果其余代码( find()
、 fetchAll()
等)特定于 Guestbook
,您可以通过设置表格获得什么灵活性?
class Application_Model_GuestbookMapper
{
protected $_dbTable;
public function setDbTable($dbTable)
{
if (is_string($dbTable)) {
$dbTable = new $dbTable();
}
if (!$dbTable instanceof Zend_Db_Table_Abstract) {
throw new Exception('Invalid table data gateway provided');
}
$this->_dbTable = $dbTable;
return $this;
}
public function getDbTable()
{
if (null === $this->_dbTable) {
$this->setDbTable('Application_Model_DbTable_Guestbook');
}
return $this->_dbTable;
}
... GUESTBOOK SPECIFIC CODE ...
}
class Application_Model_DbTable_Guestbook extends Zend_Db_Table_Abstract
{
protected $_name = 'guestbook_table';
}
最佳答案
Phil 是正确的,这被称为 lazy-loading design pattern .我刚刚在最近的一个项目中实现了这种模式,因为有以下好处:
$this->getCar()->getTires()->getSize();
$myClass->setCar(new Car());
- 编辑 -
在实现延迟加载设计模式时要小心。如果您的对象没有正确水合,则将为每条不可用的数据发出查询。最好的做法是在开发阶段跟踪数据库查询日志,以确保查询的数量和类型符合您的预期。我正在从事的一个项目是针对“详细信息”页面发出超过 27 个查询,直到我看到这些查询我才知道。
关于zend-framework - Zend - 设计模式数据映射器和表网关,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9217914/