vererbte Liste

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • vererbte Liste

    Ich möchte eine verschachtelte Liste erstellen. Die Liste enthält ein Array aus Items. Diese Items haben einen Namen und können ihrerseits wiederum ein Array von (abhängigen) Items enthalten. Und genau da hapert es.

    Anstatt
    Code:
    Setze A.
    Setze B.
    Setze C.
    Ich bin A.
    - A hat C mit drin.
    Ich bin B.
    auszugeben, gibt mir dieser Fetzen Code
    PHP-Code:
    <?php

    class Liste{

        var 
    $myItems = array();

        function 
    addItem$item ){
            
    $this->myItems[] = $item;
            echo 
    "Setze $item->name.<br>";
        }
        
    }

    class 
    Item extends Liste{
        
        var 
    $name;

        function 
    Item$name ){
            
    $this->name $name;
        }

        function 
    showItems(){
            echo 
    "Ich bin $this->name.<br>";
            while( list( 
    $key$value ) = each $this->myItems )){
                echo 
    "- $this->name hat $value->name mit drin.<br>";
                
    $value->showItems();
            } 
        }

    }

    $list = new Liste();
    $a = new Item"A" );
    $list->addItem$a );

    $b = new Item"B" );
    $list->addItem$b );

    $c = new Item"C" );
    $a->addItem$c );

    while( list( 
    $key$value ) = each$list->myItems )){
        
    $value->showItems();
    }

    ?>
    nur ein
    Code:
    Setze A.
    Setze B.
    Setze C.
    Ich bin A.
    Ich bin B.
    aus.

    Sieht vielleicht jemand von Euch meinen Fehler?
    Danke für Eure Mühe, auch wenn Ihr nix finden solltet.
    sometimes my mind wanders, then it leaves completely.

  • #2
    Hi!
    Das kann nicht klappen, weil du keine Referenz auf das $a Objekt übergibst. Somit legt er eine Kopie von $a und hängt diese an deine Liste ran. Wenn du dann $a ein Item hinzufügst, hat das dann keine Auswirkungen auf das kopierte $a Objekt in der Liste.
    Mit
    PHP-Code:
    $a = new Item"A" );
    $list->addItem( &$a ); 
    sollte es klappen.
    Gruß oms
    {brigens Ein Kezboard/Treiber ist v;llig [berfl[ssig!

    Kommentar


    • #3
      hi

      oms hat recht, du musst das aber in der methode vereinbaren (glaube ich) also :

      PHP-Code:
          function addItem( &$item ){
              
      $this->myItems[] = &$item;
              echo 
      "Setze $item->name.<br>";
          } 
      so funktioniert es bei mir
      gruesse von pau

      Kommentar


      • #4
        Herrlich. Tausend Dank.

        Natürlich muss es ne Referenz sein... *andenkoppklatsch*

        Allerdings ist "Call by Reference" wie oms es vorgeschlagen hat depreciated. Die Vereinbarung, dass es eine Referenz ist, muss in der Methode stehen.
        Zuletzt geändert von r*bot; 11.02.2003, 15:45.
        sometimes my mind wanders, then it leaves completely.

        Kommentar


        • #5
          Aber doch _nur_ in der Parameterliste, oder?!
          {brigens Ein Kezboard/Treiber ist v;llig [berfl[ssig!

          Kommentar


          • #6
            --> oms

            hatte ich auch erst gedacht geht aber nicht
            (sehr ungewoehlich)

            gruesse von pau

            Kommentar


            • #7
              Ja gut, es erscheint mir logisch!
              Sonst würde man das Item von &$item nach $this->myItems[] ja wieder kopieren.

              Grüße oms
              {brigens Ein Kezboard/Treiber ist v;llig [berfl[ssig!

              Kommentar

              Lädt...
              X