[PHP]Klassenproblem bei dynamischer Liste*erledigt*

Sider

Well-known member
ID: 61262
L
20 April 2006
393
30
Hallo. Hab versucht in PHP eine dynamisch verkettete Liste zu implementieren. Hab das bisher nur in Java realisiert und mit OOP in PHP noch gar keine Erfahrung. Das Problem liegt in Zeile 25.

Code:
Fatal error: Call to a member function on a non-object

Ich interpetier das so, dass er den return-Wert von getVorgaenger() nicht als Objekt wertet. Kann mir da jemand erklären, wie ich das Problem lösen kann?

PHP:
//Dynamische Liste - Spielumgebung
class Spielumgebung {
	
 	var $anfang;
	var $ende;
	
	//Konstruktor
	function Spielumgebung() {
		
		$this->$anfang = new Feld();		
		$this->$ende = new Feld();		
		$this->$anfang->setNachfolger($ende);
		$this->$ende->setVorgaenger($anfang);
		
	}

	//Einfügen eines Felds am Ende der Liste
	function einfuegen($action_neu, $wert_neu) {
		
		$feld = new Feld();
		
		//Verknüpfungen erneuern
		$feld->setVorgaenger($this->$ende->getVorgaenger());
		$foo = $this->$ende->getVorgaenger();
        $foo->setNachfolger($feld);
		$feld->setNachfolger($this->$ende);
		$this->$ende->setVorgaenger($feld);
		
	}
	
}

//Dynamische Liste - Feld der Spielumgebung
class Feld {
	
	var $vorgaenger;								
	var $nachfolger;								
	
	//Konstruktor
	function Feld() {
		
		$vorgaenger = null;
		$nachfolger = null;
		
	}
	
	function setNachfolger($nachfolger_neu) {
		
		$this->$nachfolger = $nachfolger_neu;
		
	}
	
	function getNachfolger() {
		
		return $this->$nachfolger;
		
	}
	
	function setVorgaenger($vorgaenger_neu) {
		
		$this->$vorgaenger = $vorgaenger_neu;
		
	}
	
	function getVorgaenger() {
		
		return $this->$vorgaenger;
		
	}	
	
}

Bis dann
Sider
 
Zuletzt bearbeitet:
... halb-falsch gedacht

Instanzvariablen ruft man eigtl. via $this->var auf.

edit: Seit php5 sollte man den Konstruktor __construct() taufen ;)

edit2: Da waren die Finger wohl schneller wie der Kopf ... Auf jedenfall ist $this->$foo kein Objekt. Sicher, dass $this->$foo existiert?
 
Zuletzt bearbeitet:
Sorry, $this->$foo ist natürlich schwachsinn. Ich habs mal oben editiert. Ändert aber nichts an der Fehlermeldung.
 
Auf den ersten Blick fällt auf, dass es $this->$ende vermutlich nicht geben wird. Du meinst wohl eher $this->ende. Da würde ich erstmal ansetzen.
 
So, hab´s mal auf die Schnelle umgeändert und hoffe, dass das so funktioniert ...

PHP:
<?php
//Dynamische Liste - Spielumgebung
class Spielumgebung {
    
    private $anfang = NULL;
    private $ende = NULL;
    
    //Konstruktor
    function __construct() {
        
        $this->anfang = new Feld();        
        $this->ende = new Feld();       
        $this->anfang->setNachfolger($this->ende);
        $this->ende->setVorgaenger($this->anfang);
        
    }

    //Einfügen eines Felds am Ende der Liste
    function einfuegen($action_neu, $wert_neu) {
        
        $feld = new Feld();
        
        //Verknüpfungen erneuern
        $feld->setVorgaenger($this->ende->getVorgaenger());
        $vorgaenger = $this->ende->getVorgaenger();
        $vorgaenger->setNachfolger($feld);
        $feld->setNachfolger($this->ende);
        $this->ende->setVorgaenger($feld);
        
    }
    
}

//Dynamische Liste - Feld der Spielumgebung
class Feld {
    
    private $vorgaenger = NULL;
	private $nachfolger = NULL;                                                              
    
    //Konstruktor
    function __construct() {   
    }
    
    function setNachfolger($nachfolger_neu) {
        
        $this->nachfolger = $nachfolger_neu;
        
    }
    
    function getNachfolger() {
        
        return $this->nachfolger;
        
    }
    
    function setVorgaenger($vorgaenger_neu) {
        
        $this->vorgaenger = $vorgaenger_neu;
        
    }
    
    function getVorgaenger() {
        
        return $this->vorgaenger;
        
    }    
    
}
?>
 
Es sollte erstmal reines PHP4 bleiben. Kann mir jemand erklären, was der Unterschied zwischen $this->ende und $this->$ende ist?

@edit Johnson, deine Variante funktioniert. Lag wohl wirklich an dem $ende. Jetzt muss mir nur wer den Unterschied erklären. Aber schonmal Danke.
 
$this->ende referenziert immer auf die Variable ende des Objektes, in dem es sich befindet. $this->$ende referenziert auf eine beliebige (unter Umständen nicht vorhandene) Variable innerhalb des Objektes in Abhängigkeit der Variablen $ende. Du wirst die Variable, die Du ansprechen willst, nur in dem Fall richtig ansprechen können, wenn die Variable $ende den String 'ende' enthält. Steht in $ende bspw 'foo', wird $this->foo referenziert.