我有一个“充当”自定义模板的模型类(显然,它扩展了 Doctrine_Record)。
我想得到这样的值:“echo $record->virtual_field”。有没有办法在我的自定义模板中覆盖 getter 方法以提供自定义响应,然后将请求传递给父类或不传递?
换句话说,有没有办法从相关模板中覆盖 Doctrine_Record::__get() ?
我有一个“充当”自定义模板的模型类(显然,它扩展了 Doctrine_Record)。
我想得到这样的值:“echo $record->virtual_field”。有没有办法在我的自定义模板中覆盖 getter 方法以提供自定义响应,然后将请求传递给父类或不传递?
换句话说,有没有办法从相关模板中覆盖 Doctrine_Record::__get() ?
好的。我假设您不是在谈论实际的行为'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;
}
}