Mailinglisten-Archive |
P. Genna Privat wrote: > Hallo mal wieder, > > diesmal hab ich folgende Idee: > Wir haben das Objekt 'test' welches wiederum das Objekt 'text' haben > könnte, aber in diesem Fall nicht hat. Objekt 'text' hat die Methode > 'sprich'. Im Gedanken 'test' hätte 'text' rufen wir also: > 'test->text->sprich()'. Das hier die allseitsbeliebte Fehlermeldung > :'Call to a member function spich() on a non-object' erscheint, ist > verständlich. > Möglichkeiten hier wäre das Magische '__get()', damit könnte ich ja > ausfinden welches Objekt fehlt und dieses nachladen. Aber wie finde ich > raus welche Methode auf das Objekt ausgeführt werden sollte? Ist das > überhaupt möglich? > > <php > class test{ > public function __get($name){ > $this->$name = new $name; > #echo "Objekt $name ist nicht forhanden"; > #hier hab ich das fehlende Objekt rein geladen, aber wie bekomme > ich die vorletzt aufgerufene Funktion? > } > } > class text{ > public function sprich(){ > echo "Mich wirst du so nie sehen"; > } > } > $run = new test; > $run->text->sprich(); > ?> > > Im Abschluss sei gesagt das es nur ein Gedankensprung ist. Wenn es nicht > geht ist es auch ok. > Dies ist eine Frage der Machbarkeit. Klar geht das... Du hast es auch fast schon richtig gemacht. So ungefähr funktioniert das overloading, wenn du es manuell machen würdest: Aus --- echo $myObj->myProperty --- wird in php5 --- if (isset($myObj->myProperty)) echo $myObj->myProperty; else echo $myObj->__get('myProperty'); --- Mit anderen Worten: Die __get Funktion muss auch was zurückgeben. Der Wert den __get zurückgibt wird dann für die Eigenschaft genommen. Und dein __get gibt nichts zurück. Wenn du da einfach public function __get($name) { $this->$name = new $name; return $this->$name; //diese Zeile ist neu } hinzufügst, dann hast du's. Yannik
php::bar PHP Wiki - Listenarchive