Frage

Ich habe eine Modellklasse (natürlich, es erstreckt sich Doctrine_Record), dass „fungiert als“ eine benutzerdefinierte Vorlage.

Ich möchte Werte wie folgt erhalten: "echo $ rekord> virtual_field". Gibt es eine Möglichkeit, die Getter-Methode in meiner benutzerdefinierten Vorlage außer Kraft zu setzen eine eigene Antwort zu liefern, dann passiert entweder auf der Anforderung der übergeordneten Klasse oder nicht?

Mit anderen Worten ist es eine Möglichkeit, Doctrine_Record außer Kraft zu setzen :: __ get () aus einer verwandten Vorlage?

War es hilfreich?

Lösung

Ok. Ich nehme an, Sie sprechen nicht über das tatsächliche Verhalten ‚ACTAS‘ Vorlagen.

Wenn Sie eine neue __get () -Methode definieren, wird automatisch der Eltern __get () -Methode außer Kraft setzen.

Jetzt in Ihrem neuen __get () -Methode, überprüfen Sie zuerst, ob es in Ihrer aktuellen Instanz vorhanden ist, und dann die Eltern.

ich gehackt diese zusammen (bedenken, es ist fast Mitternacht):

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

Jetzt weiß ich nicht, wie gut das funktioniert für das, was Sie versuchen zu erreichen.

Andere Tipps

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;
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top