[PHP] Objekt-Eigenschaften einer abgeleiteten Klasse in der Basisklasse verwenden

[PHP] Objekt-Eigenschaften einer abgeleiteten Klasse in der Basisklasse verwenden

saftmeister

Nutze den Saft!
saftmeister hat eine neue Ressource erstellt:

[PHP] Objekt-Eigenschaften einer abgeleiteten Klasse in der Basisklasse verwenden - Als Abfallprodukt aus meinem Beispiel-OR-Mapper

Eigentlich ist es nicht möglich, in Basis-Klassen auf die Objekt-Eigenschaften einer davon abgeleiteten Klasse zuzugreifen. Ich zeige hier, wie es (ohne Reflection) dennoch möglich ist, durch einen Hack:

Vater-Klasse
PHP:
<?php
class Vater
{
  private $vaterEigenschaft;

  /**
   * Evil hack to retrieve the properties from the derived class
   *
   * This method uses a hack to get class properties without the
   * use of reflection to minimize the dependencies to php functionality.
   *...

Weitere Informationen zu dieser Ressource...
 
Ganz interessant, dass das geht, aber was ist der reale Anwendungsfall? Ist es nicht schlechtes Design, so etwas zu nutzen?

Ich sehe gerade, dass du es in deinem ORM nutzt. Wäre es nicht besser, gesetzte Werte mittels der Magic Method __set() in Kindklassen in ein von der Elternklasse deklariertes assoz. Array zu speichern? Somit entgehst du auch dem Fall, dass ungewollt Attribute herangezogen werden.
 
Danke für das Feedback,

eigentlich ist das nur eine Krücke, ich habe mit dem ORM noch anderes vor. Mein Plan geht in die Richtung, Annotations zu verwenden und über die getDocComment() alles abzudecken, was das Leben noch einfacher machen wird.

Mir ging es erstmal darum, es zum laufen zu bringen und da kam mir diese Krücke recht. :) Über Reflections werden die Dinge einfacher werden, ich wollte erstmal eine Version haben, in der nicht noch mehr Technologie untergebracht ist. Das Thema ist ohnehin schon komplex.

Das mit dem Array habe ich noch nicht verstanden, kannst du ein kleines Beispiel zeigen?
 
Das mit dem Array habe ich noch nicht verstanden, kannst du ein kleines Beispiel zeigen?
Man braucht dazu noch nicht einmal eine Kindklasse:
PHP:
class RootModel {
  protected $fields = [];

  public function __set($key, $val) {
    $this->fields[$key] = $val;
  }
  public function __get($key, $val) {
    return $this->fields[$key];
  }
}

Ein großer Nachteil ist allerdings, dass das versehentliche Setzen von Attributen mitunter subtile Folgen nach sich ziehen kann. Eventuell überprüft man das gesetzte / gelesene Attribut mit einer Liste von Attributen der DB, die der Nutzer selbst bei der Ableitung des RootModels angeben muss.

Da scheint es vor 4 Jahren (vllt. immer noch?!) Probleme mit Bytecode Caches zu geben. Siehe den ersten Kommentar auf der Doku-Seite:
If you're using a bytecode cache like eAccelerator this method will return FALSE even if there is a properly formatted Docblock. It looks like the information required by this method gets stripped out by the bytecode cache
 
Zurück