gpt4 book ai didi

zend-framework - Zend - 设计模式数据映射器和表网关

转载 作者:行者123 更新时间:2023-12-04 06:37:26 25 4
gpt4 key购买 nike

这直接出自 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 .我刚刚在最近的一个项目中实现了这种模式,因为有以下好处:

  • 当我调用 getMember() 方法时,我会得到一个返回值,不管它之前是否设置过。这非常适合 method chaining :$this->getCar()->getTires()->getSize();
  • 这种模式提供了灵活性,因为外部调用代码仍然能够设置成员值:$myClass->setCar(new Car());

  • - 编辑 -

    在实现延迟加载设计模式时要小心。如果您的对象没有正确水合,则将为每条不可用的数据发出查询。最好的做法是在开发阶段跟踪数据库查询日志,以确保查询的数量和类型符合您的预期。我正在从事的一个项目是针对“详细信息”页面发出超过 27 个查询,直到我看到这些查询我才知道。

    关于zend-framework - Zend - 设计模式数据映射器和表网关,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9217914/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com