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()_setupTableName()init()

于 2012-11-15T05:50:37.530 に答える
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 に答える
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 に答える