PHP Klassenfunktionen verschachteln

FoxCore

Cadet 3rd Year
Registriert
Jan. 2008
Beiträge
41
Hallo Leute,

hab mal wieder eine Frage:

Wie kann ich im PHP Funktionen, bzw. Klassenfunktionen verschachteln? Kleines Beispiel, damit ihr wisst um was es geht:

PHP:
$xml = new SimpleXMLElement($xmlstring);
$xml->addChild("a")->addAttribute("b", "c");

Wie ihr seht, sind hier die Funktionen verschachtelt. Ich weiss nur nicht, wie ich dies zu gestalten habe, damit ich solche Funktionalität erhalte.

Konkret möchte ich folgendes machen:

Ich möchte Userobjekte dynamisch on-the-fly beim Zugriff aus der DB beziehen, damit ich nicht jedes mal vorher das Userobjekt in einer frei herumfliegenden Variabel instanzieren muss und das ganze mit der Zeit etwas messy wird, bzw. schnell redundante Daten entstehen.

PHP:
$users = new userCollection();
$users->user($id)->get("vorname");

Die Funktion user() soll dann falls noch nicht vorhanden den entsprechenden User instanzieren und aus der DB laden. Die Funktion get() soll dann ein Attribut des eben instanzierten Userobjekts zurückgeben.

Hoffe es kann mir jemand helfen.
 
Zuletzt bearbeitet:
FoxCore schrieb:
PHP:
$xml = new SimpleXMLElement($xmlstring);
$xml->addChild("a")->addAttribute("b", "c");

In diesem Fall sollte die Methode addChild() das Objekt zurückgeben, sprich:
PHP:
return $this;

Falls es dir trotzdem unklar ist, google nach dem Begriff "method chaining".
 
in OOP sollte es möglich sein, die methoden zu verketten, ohne jedes mal das objekt zurückzugeben.
 
@npaul: Hää, also das geht nicht gut. Die Funktion gibt den Typ zurück und wird von Links nach rechts evaluiert. D.h. in diesem Beispiel muss $xml::addChild() eine Klassen mit der Funktion addAttribute zurückgeben. Sonst gehts defintiv nicht.

@FoxCore:
Also wie wärs mit eine klasse UserCollection und einer Klasse user.
Die userCollection::user($id) gibt ein user zurück. Die user::get() gibt dann den String zurück.
In der UserCollection sind die user Bspw. in einem Array gespeichert und wenn !in_array($key), dann wird per new user(...) ein user eingefügt und dann der user zurückgegeben.
Der user muss natürlich ein Konstruktor haben, der dann die Klasse richtig initialisiert.
 
Zurück
Oben