phpbar.de logo

Mailinglisten-Archive

[php] Re: Doppelt verkettete List / Zeiger

[php] Re: Doppelt verkettete List / Zeiger

Manfred Jordan manfred.jordan at berlitz.de
Fre Jun 3 13:07:09 CEST 2005


> 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