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