質問

カスタムテンプレートとして「機能する」モデルクラス(明らかに、Doctrine_Recordを拡張します)があります。

このような値を取得したい:「echo $ record-> virtual_field」。カスタムテンプレートのゲッターメソッドをオーバーライドしてカスタム応答を提供する方法はありますか?

言い換えれば、関連テンプレートからdoctrine_record :: __ get()をオーバーライドする方法はありますか?

役に立ちましたか?

解決

Ok。私はあなたが実際の行動「Actas」テンプレートについて話しているのではないと思います。

新しい__get()メソッドを定義すると、親の__get()メソッドを自動的にオーバーライドします。

これで、新しい__get()メソッドで、最初に現在のインスタンスに存在するかどうかを確認し、次に親のメソッドを確認します。

私はこれを一緒にハッキングしました(覚えておいてください、それはほぼ真夜中です):

<?php
class bar {
public $data = array();
  public function __construct() {
    $this->data['virtual_field'] = "set in bar";
  }

  public function  __get($name) {
    if(array_key_exists($name, $this->data)) {
      return $this->data[$name];
    }
    return null;
  }

  public function __set($name, $value) {
    $this->data[$name] = $value;
  }
}

class foo extends bar {
public $data = array();
  public function __construct() {

  }

  public function  __get($name) {
    if(array_key_exists($name, $this->data)) {
      return $this->data[$name];
    }
    if (parent::__get($name))
      return parent::__get($name);

    return null;
  }

  public function __set($name, $value) {
    $this->data[$name] = $value;
  }
}

$a = new foo;
echo $a->virtual_field;

今、私はあなたが達成しようとしていることにこれがどれほどうまく機能するかわかりません。

他のヒント

class Product extends Doctrine_Record {

    //...

    public function __get($name) {
        if ($name == 'virtual_field') {
            return $this->virtual_field();
        }                                                     
        else {
            return parent::__get($name);
        }
    }


    public function virtual_field() {
        // calculate or retrieve virtual field value
        return $value;
    }
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top