ERLEDIGT
NEIN
NEIN
ANTWORTEN
12
12
ZUGRIFFE
366
366
EMPFEHLEN
-
09.04.08 19:16 #1
- Registriert seit
- Mar 2007
- Beiträge
- 25
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-Code:<?php
class MenueAttributes
{
var $menueName;
var $felderverweise;
var $feldernamen;
var $menuePrevious;
var $menueNext;
function __construct()
{
}
}
?>Also meine Probleme bei der Sache sind:PHP-Code:<?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>";
}
}
?>- Es funktioniert nicht in der Klasse ein Objekt von der Klasse selbst zu machen.
- Es geht irgendwie nicht über $this->menueAktuell->felderverweise auf die Felderverweise von menueAktuell zuzugreifen.
- Wie kann ich das mit dem Zeiger auf das eigene Objekt lösen in PHP. In C++ ist das ja leichter.
- 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
-
10.04.08 18:11 #2
- Registriert seit
- Mar 2007
- Beiträge
- 25
Ok wenn sich niemand meines Codes erbarmen will, kann er mir auch einfach einen Link für "verkettete Listen" in php geben.
-
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 -
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.Versuche nie Probleme zu lösen, von deren Existenz du noch gar nichts weißt!
-
10.04.08 18:32 #4
- Registriert seit
- Mar 2007
- Beiträge
- 25
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 :1
Element1 -> Element2 -> Element3 -> Element3
kann genauso ausgewertet werden wie
Code :1
Element1 -> Element2 -> Element3 -> null
Es kommt rein darauf an, wie du deine iterierende Methode gestaltest.Versuche nie Probleme zu lösen, von deren Existenz du noch gar nichts weißt!
-
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.Versuche nie Probleme zu lösen, von deren Existenz du noch gar nichts weißt!
-
14.04.08 15:25 #10
- Registriert seit
- Mar 2007
- Beiträge
- 25
Könnte mir jemand einen Link schicken für verkettete Listen in php oder mir seine Idee genauer erklären.
-
15.04.08 19:12 #11
- Registriert seit
- Mar 2007
- Beiträge
- 25
BITTEEEEEEEE hilft mir jemand.!!
-
Hast du's schon mal mit
versucht?
Es gibt da auch sowas wie Wikipedia.
Und alle spucken massig Artikel aus.
Aber da ich grad nix besseres zu tun habe - ein kleines Beispiel in Java
Code java:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
public class Node { int info; Node next; public void Node(int info) { this.info = info; } public void setNext(node next) { this.next = next; } public Node getNext() { return next; } public int getInfo() { return info; } public void setInfo(int info) { this.info = info; } public void iterate() { if(info != 0) { System.out.println(info); next.iterate(); } } }
Das ist ein klassischer Knoten einer verketteten Liste, der alles bietet, was man braucht um eine verkettete Liste zu erstellen. Es wird extern ein Null-Knoten definiert, der ein Abbruchkriterium (im Beispiel info = -1) enthält. Danach kannst du Kette aufbauen und an jeder Position die Iteration starten (Knoten1.iterate() = gesamte Liste, Knoten73.iterate() = Teil der Liste)Versuche nie Probleme zu lösen, von deren Existenz du noch gar nichts weißt!
-
17.04.08 16:19 #13
- Registriert seit
- Mar 2007
- Beiträge
- 25
Das Problem bei mir waren die Referenzen. Danke für die Hilfe. Wenn jemand anhand einer verketetten Liste ein Menü erstellen will. Hier ist der Code. Natürlich noch ausbaubar.
PHP-Code:<?php
class MenueAttributes
{
public $menueName;
public $felderverweise = array();
public $feldernamen = array();
public $menuePrevious;
public $menueNext;
function __construct()
{
}
}
?>PHP-Code:<?php
require_once("Includes\menue\menueAttributes-class.php");
class Menue extends MenueAttributes
{
public $menueAktuell;
function __construct($felderverweise,$feldernamen,$name)
{
$this->menueAktuell = new MenueAttributes();
$this->menueAktuell->menuePrevious = null;
$this->menueAktuell->menueName = &$name;
for($i=0;$i<sizeof($feldernamen);$i++)
{
$this->add($felderverweise[$i], $feldernamen[$i]);
}
}
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->menueNext = new MenueAttributes(); //erstellt ein neues Menue in der Liste
$this->menueAktuell->menueNext->menuePrevious = $this->menueAktuell;
$this->menueAktuell->menueNext->menueNext = null;
$this->menueAktuell = $this->menueAktuell->menueNext; //setzt die Liste auf das neue Menue
$this->menueAktuell->menueName = &$name;
for($i=0;$i<sizeof($feldernamen);$i++)
{
$this->add($felderverweise[$i], $feldernamen[$i]);
}
}
}
function &getMenue()
{
echo "Menueaktuell: ".$this->menueAktuell->menueName."<br>";
return $this->menueAktuell;
}
function setMenue(&$menueAktuell)
{
$this->menueAktuell = $menueAktuell;
}
function setMenue($menueName) //Setzt das aktuelle Menue auf das Menue mit dem Menuenamen $menueName
{
$this->goToFirst();
while($this->menueAktuell->menueName != $menueName || $this->menueAktuell != null)
{
$this->menueAktuell = $this->menueAktuell->menueNext;
}
}
function add(&$felderverweis,&$feldername) //Fügt einem Menue ein Feld hinzu
{
array_push($this->menueAktuell->felderverweise, &$felderverweis);
array_push($this->menueAktuell->feldernamen, &$feldername);
}
function delete($feldername)
{
if(($index = array_search($feldername, $this->menueAktuell->feldernamen)))
{
unset($this->menueAktuell->feldernamen[$index]);
unset($this->menueAktuell->felderverweise[$index]);
}
}
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
{
echo "<ul id='navi'>";
echo "<li type='square'>".$this->menueAktuell->menueName."</li>";
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>";
}
}
?>
Verwendung der Klasse:
PHP-Code:$felderverweis = array("login.php","registry.php","login.php","forum.php");
$feldernamen = array("Startseite","Registrieren","Login","Forum");
$menue = new Menue($felderverweis,$feldernamen,"Main"); //Neues Menue erstellen
$felderverweis = "Formulare\Adminbreich\admin.php";
$feldername = "Adminbereich";
$menue->add($felderverweis,$feldername); //Feld im aktuellen Menue hinzufügen
$menue->delete($feldername); //Feld im aktuellen Menue löschen
$menue->showMenue(); //aktuelle Menü ausgeben
Geändert von reuabreliz (17.04.08 um 16:23 Uhr)
Ähnliche Themen
-
DIV untereinander+ listen
Von jackob100 im Forum CSSAntworten: 1Letzter Beitrag: 26.01.08, 19:10 -
Irc listen
Von azubi2 im Forum .NET Web und KommunikationAntworten: 3Letzter Beitrag: 25.10.05, 09:49 -
DLL Listen- Absturz, Listen übergeben
Von haemmer im Forum C/C++Antworten: 0Letzter Beitrag: 05.02.04, 21:00 -
listen in c++?
Von mts im Forum C/C++Antworten: 13Letzter Beitrag: 09.07.03, 19:04





Zitieren
Login






[PHP][Snippet] Array zu XML konvertieren