verketette listen.

reuabreliz

Mitglied
Also ich hätte gerne eine Menueklasse. Das Menue soll anhand verketteter Listen aufgebaut sein. Ich habe eine Klasse MenueAttributes. Die wird von der Klasse Menue geerbt. Ich weiß dass ich das in einer Klasse auch machen kann. Aber dann kenne ich mich nicht mehr aus. Wenn es funktioniert, werde ich die Attribute in die Klasse Menue einbinden.

PHP:
<?php

class MenueAttributes
{
	var $menueName;
	var $felderverweise;
	var $feldernamen;
	var $menuePrevious;
	var $menueNext;
	
	function __construct()
	{
	}
}

?>

PHP:
<?php
require_once("Includes\menue\menueAttributes-class.php");

class Menue extends MenueAttributes 
{
	var $menueAktuell;
	
	function __construct() //erstellt Neues Menue
	{
		$this->menueAktuell = new Menue();
		$this->menueAktuell->menuePrevious = null;
	}
	
	function __destruct() //zerstört das ganze Menue *muhahaha*
	{
		unset($this->menueAktuell);
	}
	
	function addMenue($felderverweise,$feldernamen,$name) //fügt ein Menue mit einer bestimmten FelderAnzahl hinzu
	{
		if(sizeof($felderverweise) == sizeof($feldernamen))
		{		
			$this->menueAktuell->menueName = $name;
 			for($i=0;$i<sizeof($feldernamen);$i++)
 			{
 				$this->add($felderverweis, $feldername);
 				echo "Felderverweise: ".$this->menueAktuell->felderverweise[$i];
 			}
 			$this->menueAktuell->menueNext = new Menue();
 			$this->menueAktuell->menueNext->menuePrevious = $this->menueAktuell;
 			$this->menueAktuell->menueNext->menueNext = null;
 			$this->menueAktuell = $this->menueAktuell->menueNext;
		}
	}
	
	function getMenue()
	{
		return $this->menueAktuell;
	}
	
	function add($felderverweis, $feldername) //Fügt einem Menue ein Feld hinzu
	{
		$this->menueAktuell->felderverweise = array();
		$this->menueAktuell->feldernamen = array();
		array_push($this->menueAktuell->felderverweise, $felderverweis);
		array_push($this->menueAktuell->feldernamen,$feldername);
	}
	
	function goToFirst() //geht zum ersten Menue
	{
		while(($this->menueAktuell->menuePrevious == null))
		{
			$this->menueAktuell = $this->menueAktuell->menuePrevious;
		}
	}
	
	function goToLast() //geht zum Letzten Menue
	{
		while(($this->menueAktuell->menueNext == null))
		{
			$this->menueAktuell = $this->menueAktuell->menueNext;
		}
	}
	
	function showMenue() //gibt das Menue formatiert aus
	{
		$this->goToFirst();
		echo "<ul id='navi'>";
		while($this->menueAktuell->menueNext == null) //durchläuft alle Menues
		{
			echo "<li><ul>".$this->menueAktuell->menueName;
			for($i=0; $i < sizeof($this->menueAktuell->felderverweise); $i++) //durchläuft alle Felder eines Menues
			{
				echo "<li><a href='index.php?mainsite=".$this->menueAktuell->felderverweise[$i]."'>".$this->menueAktuell->feldernamen[$i]."</a></li>";
			}
			echo "</ul></li>";
			$this->menueAktuell = $this->menueAktuell->menueNext;
		}
		echo "</ul>";
	}
}

?>

Also meine Probleme bei der Sache sind:
  1. Es funktioniert nicht in der Klasse ein Objekt von der Klasse selbst zu machen.
  2. Es geht irgendwie nicht über $this->menueAktuell->felderverweise auf die Felderverweise von menueAktuell zuzugreifen.
Meine Fragen sind:
  1. Wie kann ich das mit dem Zeiger auf das eigene Objekt lösen in PHP. In C++ ist das ja leichter.
  2. Ja und Allgemeine Verbesserungen die ich übersehen habe oder die anders gehören

Also alles in allem zusammengefasst, löse ich in PHP das Problem mit den Zeigern auf das eigene Objekt, die ich ja für eine verkettete Liste brauche
 
Zu den Problemen:
Zu 1.: Du kannst nicht während des Konstruktors ein Objekt derselben Klasse erstellen, das du in deiner Klasse speicherst. Das dürfte in keiner vernünftigen Sprache gehen. Du erzeugst da ja eine endlose Konstruktor-Aufruf-Schleife. Es schaut so aus, als wolltest du einen Singleton nachbilden. Dann solltest du das aber auch tun - :google: hilft dir bei diesem Begriff schneller weiter als ich jetzt alles schreiben könnte.

Zu 2.: Geht das grundsätzlich nicht, oder ist das vielleicht ein Folgefehler?
Ich kenn mich mit OOP in PHP nicht so aus, aber evtl vererbst du die Variablen nicht public - demzufolge sind sie in der Kind-Klasse nicht direkt verfügbar. Lösung: public vererbte Setter und Getter.

Zu den Fragen:
Zu 1.: Siehe auch oben Punkt 1. Ein Pointer auf sich selbst ist nicht unbedingt notwendig.
Kann bei der Abarbeitung deines Menüs sogar hinderlich sein, wenn du dich in eine Schleife bewegst und nicht aufpasst. Du kannst hier genauso eine Art "Null"-Pointer verwenden, dass dir das Ende der Liste markiert.
 
Wie soll den deiner Meinung nach sonst eine verkettete Liste ausschauen ohne Pointer auf sich selbst? Das ist doch die Idee dabei
 
Punkt 1: Es gibt nicht DIE verkettete Liste. Es gibt mehrere Arten sowas umzusetzen.
(Doppelt verkettet, Ringschluss, usw)

Punkt 2: Es ist erstmal egal, ob das letzte Element in der Liste auf null oder auf sich selbst zeigt

Code:
Element1 -> Element2 -> Element3 -> Element3

kann genauso ausgewertet werden wie

Code:
Element1 -> Element2 -> Element3 -> null

Es kommt rein darauf an, wie du deine iterierende Methode gestaltest.
 
Du verwendest ja PHP4....
Bei PHP4 & PHP5 gibt es im OOP bereich ja leichte unterschiede...
PHP4 alle variablen sind public, es wird keine Referenz sondern eine Kopie weitergereicht...
Und der Konstruktor hat den namen der Klasse, Destruktor existiert nicht.
Um eine Referenz weiter zu reichen verwendet man das & Zeichen vor der Variable...
 
Wenn du aus einer anderen klasse was vererben möchtest dann mußt du dafür extends verwenden.

New in eine klasse ist kompleter blödsin und auch net möglich


Mfg Splasch
 
Wieso ist new nicht möglich?
(Womöglich habe ich aber auch was falsch verstanden...)
Singleton Pattern besteht doch aus new in der Eigenenklasse durch den Erstenaufruf von:
function getInstance();
 
Natürlich ist new innerhalb einer Klasse möglich - aber keinesfalls im Konstruktor (wie ich oben schon beschrieben habe, würde das zu einer unendlichen Konstruktor-Aufruf-Orgie führen)

Beim Singleton-Pattern wird der Konstruktor auf Private gesetzt - die Klasse kann nicht direkt instanziiert werden. Darum gibt es die statische Methode getInstance(), die die einmalige Initialisierung des Klasse mit new vornimmt und das Objekt in der Klasse selbst abspeichert.
 

Neue Beiträge

Zurück