0

在我的模型中,我正在扩展 Zend_Db_Table_Abstract。在里面,我有一个protected $_name = 'table_name'. 现在,如果我定义一个构造函数和一个私有变量private $_var并在构造函数中定义它,模型就不再工作了!当我打电话$this->createRow()或任何事情时,什么都没有发生!为什么这个构造函数会这样做?!

这就是我所拥有的:

 <?php
 class myClass extends Zend_Db_Table_Abstract
 {
      protected $_name = 'table_name';
      private $_var;

      public function __construct($var)
      {
           $this->_var = $var;
      }

      public function getById($id)
      {
           $select = $this->select()->where('id =?',$id);
           return $this->fetchRow($select);
      }
 }

这不行!如果我删除 __construct() 和私有变量,那么它可以工作!为什么?

谢谢

4

3 回答 3

2

如果你重写 的构造函数Zend_Db_Table_Abstract,你可能应该调用父构造函数:

class MyClass extends Zend_Db_Table_Abstract
{
      protected $_name = 'table_name';
      private $_var;

      public function __construct($var)
      {
           $this->_var = $var;
           parent::__construct(); // add this
      }

      // the rest...
}

父构造函数调用一些受保护的方法_setup()(依次调用 _setupDatabaseAdapter()and _setupTableName())和init()(在父构造中是空的,但您可以使用它在对象实例化的最后一步添加一些处理)。

于 2012-11-15T05:50:37.530 回答
0

提问时你必须更清楚。如果需要,请编写代码.. 没有人可以仅凭 2 条信息来确定您的应用程序出了什么问题.. 话虽如此..

首先你应该在构造函数之外定义你的变量,如果你必须在构造函数内部初始化。您的模型不会神奇地知道存在连接到您的数据库的 db 抽象类。您必须在模型构造函数中创建一个对象。

这是代码

// DB Abstract class
class Application_Model_DbTable_myTable extends Zend_Db_Table_Abstract
{

protected $_name = 'myTable';

}

// Your model class
class Application_Model_myModel {

private $_var;

public function __construct() {
    $this->_var = new Application_Model_DbTable_myTable();
 }
}

希望这就是你要找的东西.. 也是我从你的问题中理解的唯一东西。

丁斯

于 2012-11-15T01:41:28.557 回答
0

其他答案中已暗示但未说明...您的类失败了,因为您覆盖了构造函数并且没有调用父构造函数,因此没有正确创建对象。

通常在构造这些类时,它们是通过 setOptions() 构造的,它在构造函数中接受一个数组。因此,如果您真的必须重写构造函数,您可以尝试以下操作:

public function __construct($var, $config = array())
 {
      $this->_var = $var;
      parent::__construct($config);      
 }

现在您应该能够设置变量并传递您需要传递的任何配置值。

但是,如果可能的话,最好避免使用构造函数并使用提供的init()方法。

<?php
 class myClass extends Zend_Db_Table_Abstract
 {
      protected $_name = 'table_name';
      private $_var;

      public function init()
      {
           $this->_var = $var;
      }

      public function getById($id)
      {
           $select = $this->select()->where('id =?',$id);
           return $this->fetchRow($select);
      }
 }
于 2012-11-15T12:20:58.147 回答