2012-11-15 65 views
0

在我的模型中,我扩展了Zend_Db_Table_Abstract。在里面,我有一个protected $_name = 'table_name'。 现在,如果我定义一个构造函数和一个私有变量private $_var并在构造函数中定义它,那么该模型不再起作用!当我拨打$this->createRow()或任何东西时,什么也没有发生!为什么这个构造函数会这样做?!Zend模型中的构造函数

这是我有:

<?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()和私有变量,那么它的工作原理!为什么?

谢谢

+0

正如我在回答说,你应该扩展Model_DbTable不模型Zend_Db_Table_Abstract ..它不会工作.. – Dinesh

+0

@Dinesh为什么不工作?除了构造函数外,这是建立表模型的推荐方法。 – RockyFord

+0

@RockyFord ..其实我从来没有试图直接从Zend_Db_Table_Abstract扩展我的模型类。我总是以创建Application_Model_DbTable的方式编程zend模型,并在模型中创建此类的对象..但是..我想我们可以直接在模型中扩展它,并调用父构造函数..当我发布时没有考虑它答复.. – Dinesh

回答

0

你在提问时必须更清楚。编写代码,如果你必须..没有人可以确定什么是错误的应用程序与只有2条信息..与说..

首先哟应该定义你的变量以外的构造函数和初始化,如果你有至。 您的模型不会奇迹般地知道存在连接到您的数据库的数据库抽象类。你将不得不在模型构造函数中创建一个对象。

这里是代码

// 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(); 
} 
} 

希望这是你要找的..而我唯一从你的问题的理解。

喧嚣

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()_setupTableName())和init()(在父对象中为空,但可用于将对象实例化的最后一步添加一些处理)。

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); 
     } 
} 
+0

'$ var'从哪里来? ;-) –

+1

@DavidWeinraub是不是我们都必须回答的问题? :)我有麻烦想象什么参数需要传递给构造函数,不能在$ config数组中传递。但是,我不是很有想象力。 – RockyFord

+0

我的意思是在你的例子中,你设置了'$ this - > _ var = $ var',但是'$ var'在该范围内未初始化。只是挑剔。 ;-)但是,你提出一个有趣的观点。他可以将'$ config'数组中所需的任何额外信息(比如'mykey => myval'')传递给构造函数,在那里他可以将其拉出并保存在本地以供使用。无论他是直接传递还是嵌入/解开配置数组,都要求除了调用父构造函数之外,他还在自己的构造函数中执行了一些操作。 –