tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
12
ZUGRIFFE
366
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    reuabreliz reuabreliz ist offline Mitglied Bronze
    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()
        {
        }
    }

    ?>
    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>";
        }
    }

    ?>
    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
     

  2. #2
    reuabreliz reuabreliz ist offline Mitglied Bronze
    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.
     

  3. #3
    Avatar von shutdown
    shutdown shutdown ist offline Mitglied Smaragd
    Registriert seit
    Jun 2004
    Beiträge
    1.026
    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!

  4. #4
    reuabreliz reuabreliz ist offline Mitglied Bronze
    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
     

  5. #5
    Avatar von shutdown
    shutdown shutdown ist offline Mitglied Smaragd
    Registriert seit
    Jun 2004
    Beiträge
    1.026
    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!

  6. #6
    R00Ki3 R00Ki3 ist offline Mitglied Gold
    Registriert seit
    Oct 2004
    Ort
    NRW
    Beiträge
    247
    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...
     

  7. #7
    splasch splasch ist offline Mitglied Brillant
    Registriert seit
    Jul 2004
    Beiträge
    854
    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
     

  8. #8
    R00Ki3 R00Ki3 ist offline Mitglied Gold
    Registriert seit
    Oct 2004
    Ort
    NRW
    Beiträge
    247
    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();
     

  9. #9
    Avatar von shutdown
    shutdown shutdown ist offline Mitglied Smaragd
    Registriert seit
    Jun 2004
    Beiträge
    1.026
    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!

  10. #10
    reuabreliz reuabreliz ist offline Mitglied Bronze
    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.
     

  11. #11
    reuabreliz reuabreliz ist offline Mitglied Bronze
    Registriert seit
    Mar 2007
    Beiträge
    25
    BITTEEEEEEEE hilft mir jemand.!!
     

  12. #12
    Avatar von shutdown
    shutdown shutdown ist offline Mitglied Smaragd
    Registriert seit
    Jun 2004
    Beiträge
    1.026
    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!

  13. #13
    reuabreliz reuabreliz ist offline Mitglied Bronze
    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

  1. DIV untereinander+ listen
    Von jackob100 im Forum CSS
    Antworten: 1
    Letzter Beitrag: 26.01.08, 19:10
  2. Irc listen
    Von azubi2 im Forum .NET Web und Kommunikation
    Antworten: 3
    Letzter Beitrag: 25.10.05, 09:49
  3. DLL Listen- Absturz, Listen übergeben
    Von haemmer im Forum C/C++
    Antworten: 0
    Letzter Beitrag: 05.02.04, 21:00
  4. listen in c++?
    Von mts im Forum C/C++
    Antworten: 13
    Letzter Beitrag: 09.07.03, 19:04