Doctrine 1.2:从模板覆盖Doctrine_Record :: __ get()

时间:2010-09-16 19:28:46

标签: doctrine behavior getter-setter doctrine-1.2

我有一个模型类(很明显,它扩展了Doctrine_Record)“充当”自定义模板。

我想获得这样的值:“echo $ record-> virtual_field”。有没有办法在我的自定义模板中覆盖getter方法以提供自定义响应,然后将请求传递给父类?

换句话说,有没有办法从相关模板覆盖Doctrine_Record :: __ get()?

2 个答案:

答案 0 :(得分:1)

确定。我假设你不是在谈论实际的行为'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;

现在我不知道这对你想要达到的目标有多好。

答案 1 :(得分:-1)

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;
    }
}