2012-11-15 122 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'')傳遞給構造函數,在那裏他可以將其拉出並保存在本地以供使用。無論他是直接傳遞還是嵌入/解開配置數組,都要求除了調用父構造函數之外,他還在自己的構造函數中執行了一些操作。 –