Frage

Was ich versuche, ein Domain-Modell mit einem Plain Old PHP-Objekt zu tun ist, erstellen. Die Ich erstelle eine Bibliothek, die die gesamte Infrastruktur Sachen tun. Also einer meiner Modelle wie folgt aussieht

class Project {
  public $id;
  public $name;
  public $typeId;

  private $type;

  public function getType() {
    return $this->type;
  }

  public function setType(Type $type) {
    $this->typeId = $type->id;
    $this->type = $type;
  }
}

Nun, wenn Sie ein neues Projekt und Call setType mit einem gültigen Typ-Objekt erstellen und das Projekt-Exemplar mit dem ORM speichert das Projekt und Art gespeichert wird. Aber dann lade ich das Projekt und die Verwendung getType Methode, die ich die ORM will diese Methode geändert hat transparent das Objekt von persitence zu laden. Also diese Methode hier:

public function getType() {
  return $this->type;
}

wird transparent geändert in:

public function getType() {
  if (is_null($this->type) {
    $this->type = $this->adapter->findById('table', $this->typeId);
  }

  return $this->type; // or return parent::getType();
}

Outlet PHP Anwendungen eval eine Proxy-Klasse zu schaffen für das Projekt Project_Proxy genannt, aber manchmal wird es Subklassen von Projekt sein, damit ich für eine Lösung bin auf der Suche nach Reflection-API zu verwenden, wenn es einen Weg gibt.

Ich habe Google-Suche aber gefunden haben, nicht ohnehin ein Verfahren Verhalten ändern

Edit:? oder wäre es eine gute Idee sein Outlet PHP-eval-Methode zu verwenden Proxy-Klassen für meine Modelle und alle Subklassen von ihnen erstellen

War es hilfreich?

Lösung

Es gibt keine eingebaute Möglichkeit, dies zu tun. Und obwohl Sie tun können, mit dem PECL-Erweiterung namens runkit , würde ich empfehlen, eine andere Lösung zu finden, . Ändern die Implementierung von Funktionen können Sie nicht wissen, alles über sehr gefährlich und könnte zu Fehlern führt, in denen nur einen einzigen Fehler Debuggen nehmen kann länger als die if (is_null(... Aussagen Schreiben für alle Ihre Funktionen.

BTW: nicht is_null() verwenden, da Sie Nullwerte aus der Datenbank immer und immer wieder holen könnten. Sie sollten die abgerufenen Werte in einer separaten Variablen speichern.

Andere Tipps

Mit Blick auf die Reflexion doc auf php.net, es scheint mir ist es unmöglich, auf dem Flug ein Verfahren zu ändern.

Sie sollten versuchen, es auf eine andere Art und Weise zu tun.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top