代码之家  ›  专栏  ›  技术社区  ›  mattalxndr

条令1.2:覆盖条令记录:从模板获取

  •  2
  • mattalxndr  · 技术社区  · 15 年前

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

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

    换句话说,是否有一种方法可以覆盖相关模板中的条令记录::get()?

    2 回复  |  直到 11 年前
        1
  •  1
  •   Dennis Meng Othman Tamim    11 年前

    好啊。我想你不是在谈论实际的行为“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;
    

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

        2
  •  -1
  •   Marcello Romani    11 年前
    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;
        }
    }
    
    推荐文章