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