カスタムテンプレートとして「機能する」モデルクラス(明らかに、Doctrine_Recordを拡張します)があります。
「echo$record->virtual_field」のような値を取得したいと思います。カスタムテンプレートのgetterメソッドをオーバーライドしてカスタム応答を提供し、その要求を親クラスに渡す方法はありますか?
言い換えれば、関連するテンプレートからDoctrine_Record :: __ get()をオーバーライドする方法はありますか?
カスタムテンプレートとして「機能する」モデルクラス(明らかに、Doctrine_Recordを拡張します)があります。
「echo$record->virtual_field」のような値を取得したいと思います。カスタムテンプレートのgetterメソッドをオーバーライドしてカスタム応答を提供し、その要求を親クラスに渡す方法はありますか?
言い換えれば、関連するテンプレートから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;
}
}