Iterator Problem

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

  • Iterator Problem

    Ich gebe von einer Methode ein Iteratorobjekt zurück. Mit diesem iterator soll man dann die Struktur durchlaufen können. Bekomm allerdings folgende Fehlermeldung:

    Fatal error: Cannot use object of type MenuItemList as array in ...
    PHP-Code:
    Erstellung
    return new 
    MenuIterator(self::$menu[md5_file($xmlFile)]);

    class 
    MenuIterator {
        private 
    $index 0;
        private 
    $data null;

        public function 
    __construct(MenuItemList $menuItemList) {
            
    $this->data $menuItemList;
        }

        public function 
    hasNext() {
            return 
    $this->index sizeof($this->data);
        }

        public function 
    next() {
            return 
    $this->data[$this->index++];
        }

    MfG Markus

  • #2
    was steht denn in
    $menu[md5_file($xmlFile)] ?

    und welcher art ist MenuItemList ?
    Beantworte nie Threads mit mehr als 15 followups...
    Real programmers confuse Halloween and Christmas because OCT 31 = DEC 25

    Kommentar


    • #3
      Hab's mal kurz rausgeschrieben
      PHP-Code:
      class Menu {
          private static 
      $menu = array();
          private 
      $xmlFile;
          
          public function 
      __construct($xmlFile) {
              
      $this->xmlFile $xmlFile;
          }
          
          public function 
      getMenuIterator() {
              
      $xmlFile $this->xmlFile;
              if(!
      array_key_exists(md5_file($xmlFile),self::$menu)) {
                  
      $SimpleXmlObj simplexml_load_file($xmlFile);
      ...
                  }
                  
      $menuItemList = new MenuItemList($name,$href);
      ...
                  
      self::$menu[md5_file($xmlFile)] = $this->loadXMLFile($SimpleXmlObj,$menuItemList);
              }
      MenuIterator(self::$menu[md5_file($xmlFile)]);
          }
      ...
      }


      class 
      MenuItemList extends MenuItem {
          private 
      $menuItemList = array();

          public function 
      __construct($name$link) {
              
      parent::__construct($name,$link);
          }

          public function 
      putMenuItem(MenuItem $menuItem) {
              
      $this->menuItemList[] = $menuItem;
          }

          public function 
      putMenuItemList(MenuItemList $menuItemList) {
              
      $this->menuItemList[] = $menuItemList;
          }
      }

      class 
      MenuItem {
          private 
      $menuItemName;
          private 
      $menuItemLink;
      ...

      Kommentar


      • #4
        Hallo Markus,

        ich kann das im Moment nicht testen, darum brainstorme ich einfach einmal:

        hast du testweise mal die Reflection-API benutzt
        (zB vor der fehlerverursachenden Zeile :

        PHP-Code:
        Reflection::export(new Reflection_Class('MenuItemList')); 
        Alternativ würde ich zum Test im Konstruktor von MenuItemList (nach dem parent-call) einmal folgendes abfragen:

        PHP-Code:
        if (is_array($this)) {
                echo 
        "bin schon ein Array<br />\n";
            }
            if (
        $this instanceof ArrayAccess) {
                echo 
        "und zwar post RC2<br />\n";
            }
            if (
        $this instanceof ArrayObject) {
                echo 
        "moep, evtl. implizites SPL-prob.<br />\n";
            } 
        etwas besseres fällt mir zZ nicht ein, aber vielleicht ist es ein Ansatz.

        nice day
        Quickborner

        Kommentar


        • #5
          Danke!

          Hab's jetzt gelöst, war ein Denkfehler. Ich muss mir den Itterator von MenuItemList zurück geben lassen und nicht von Menu. MenuitemList ist ein Objekt, ich wollt den iterator eigentlich auf $menuItemList in MenuItemList zurück geben lassen. Komisch immer wenn ich mich in's Bett leg und nochmal über das Problem nachdenk kommt mir meist die Lösung!

          MfG Markus

          PHP-Code:
          class MenuItemList extends MenuItem {
              private 
          $menuItemList = array();

              public function 
          __construct($name$link) {
                  
          parent::__construct($name,$link);
              }

              public function 
          putMenuItem(MenuItem $menuItem) {
                  
          $this->menuItemList[] = $menuItem;
              }

              public function 
          putMenuItemList(MenuItemList $menuItemList) {
                  
          $this->menuItemList[] = $menuItemList;
              }
              
              public function 
          getMenuIterator() {  // hier muss ich mir den Iterator zurück geben lassen,
          //nicht in Menu. Jetzt funktioniert es.
                  
          return new MenuIterator($this->menuItemList);
              }
          }

          Anwendung:

          $menu = new Menu("menu.xml");
          $menuItemList $menu->getMenuItemList();
          writeMenu($menuItemList);

          function 
          writeMenu(MenuItemList $menuItemList) {
              
          $iterator $menuItemList->getMenuIterator();
              while(
          $iterator->hasNext()){
                  
          $obj $iterator->next();
                  if(
          $obj instanceof MenuItemList){
                      echo 
          "Submenü: "$obj->getName()." Link: ".$obj->getLink()."<br>";
                      
          writeMenu($obj);
                  } else {
                      echo 
          "Menuitem: "$obj->getName()." Link: ".$obj->getLink()."<br>";
                  }
              }

          Zuletzt geändert von markusschmitt; 14.08.2004, 16:54.

          Kommentar

          Lädt...
          X