Mailinglisten-Archive |
> Hallo Manfred, > > Ich habe das zwar auch noch nicht gemacht, habe aber diesen Beitrag über > Google gefunden. Dort gibt es auch ein ausführliches Codebeispiel, auch > wenn es nicht komplett zu funktionieren scheint. Aber vielleicht hilft > Dir das ja als Einstieg weiter. > > http://www.tutorials.de/tutorials187232.html > > Solltest Du das Problem lösen können, würden sich hier sicher einige > freuen, wenn Du es dann in der Liste bekannt gibst. > > Gruss, > > Ralf Hallo Ralf, oh ja das Beispiel hat mir sehr viel weiter geholfen, obwohl das Problem immer noch nicht wirklich gelöst ist, weil PHP in diesem Punkt offenbar sagen wir mal sehr eigenwillig ist. Laut Handbuch gibt es ja keine Zeiger nur Referenzen. Wenn man das weiß kann man das natürlich auch nutzen. Nun ist es so, das bei php 4 die Parameterübergabe bei Objekten ab und zu by reference erfolgt. Die Doku sagt nicht weiter wann genau. Bei php 5 werden Objekte immer als Referenz übergeben. Man kann die referenzübergabe bei php4 natürlich mit dem &-Operator erzwingen, was man immerhalb der methoden auch tun sollte, sonst passiert völlig unerwartetes. Auch sollte man innerhalb der Methoden immer den this-Operator benutzen, ansonsten werden die Variablen nicht als Objektvariablen sondern als lokale Funktionsvariablen angesehen, was auch nicht so richtig prickelnd ist. Soweit so gut. Ich habe eine einfache Liste hinbekommen, in welche ich am Anfang Elemente einfügen kann. Den Code hänge ich hinten an und hoffe es stört niemanden. Was nun leider überhaupt nicht funktioniert, ist der Versuch eine Referenz auf ein Objekt zu bekommen (außerhalb der Klasse) um dieses dann zu verändern. Ja, ich weiß das man das eigentlich auch nicht machen sollte, aber es ist eben notwendig, schließlich gibt es bei oop ja auch die friend klassen, die man auch nicht benutzen sollte. :-) Problem ist nun, das ich bei der Methode getKursObjekt ja eine Referenz zurück gebe. Nun setze ich ja mit $test->ort = "Hamburg"; den Ort der Instanz mit Namen nummer1 auf Hamburg. Lasse ich das Skript ablaufen, bleibt die Instanzvariable dennoch auf Frankfurt. Lediglich der direkte Aufruf print "<p>".$test->name." ".$test->ort; bring mir den korrekten Ort. Hat jemand eine Idee warum das nicht funktioniert? Manfred <?php // ------------------ class tKurs // ------------------ { var $name; var $ort; var $stadt; var $pNext; var $pPrev; } // ------------------- class tKursListe // ------------------- { var $pHead; var $pTail; var $pAkt; function tKursListe() { $pHead = $pTail = $pAkt = NULL; } function insertHead($data) // Fügt am Anfang der Liste ein Element hinzu. { $tmp = new tKurs; $tmp->name = $data; if($this->pHead == NULL) { $this->pHead = &$tmp; $this->pTail = &$tmp; $this->pHead->pNext = NULL; $this->pHead->pPrev = NULL; $this->pHead->ort = "Frankfurt"; } else { $tmp->pPrev = NULL; $tmp->pNext = &$this->pHead; $this->pHead->pPrev = &$tmp; $this->pHead = &$tmp; } } function getKursObjekt($name) { $akt=&$this->pHead; while($akt != NULL) { if( $akt->name == $name ) return($akt); $akt = &$akt->pNext; } } } // -------------------------------------------------------------------------------------- $liste = new tKursListe; $liste->insertHead("nummer1"); $liste->insertHead("nummer2"); $liste->insertHead("nummer3"); $liste->insertHead("nummer4"); $test = &$liste->getKursObjekt("nummer1"); $test->ort = "Hamburg"; print "<p>".$test->name." ".$test->ort; print "<hr>"; $akt = $liste->pHead; while( $akt != NULL ) { echo "<p>".$akt->name." ".$akt->ort; $akt = $akt->pNext; } print "<hr>"; $akt = &$liste->pTail; while( $akt != NULL ) { echo "<p>".$akt->name; $akt = $akt->pPrev; } ?>
php::bar PHP Wiki - Listenarchive