Lehre 1.2: Übergeordnete Doctrine_Record :: __ get () aus einer Vorlage
-
03-10-2019 - |
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?
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;
}
}