Frage

Ich habe ein Objekt, das Arrayaccess , Iterator und Abzählbare . Das erzeugt eine nahezu perfekte Array Maskierung. Ich kann es Zugang mit Offsets ($object[foo]), habe ich es in einen foreach -loop werfen kann, und viele andere Dinge .

Aber was kann ich nicht tun, ist geben Sie es an den nativen Array Iterator-Funktionen (next(), reset(), current(), key()), auch wenn ich die erforderlichen Methoden von Iterator implementiert haben. PHP scheint hartnäckig zu versuchen, durch seine Mitgliedsvariablen zu durchlaufen, und ignoriert vollständig die Iterator-Methoden.

Gibt es eine Schnittstelle, die das Objekt in den verbleibenden Array-Verfahrweg-Funktionen Haken wäre, oder bin ich fest mit dem, was ich habe?

Update: IteratorAggregate scheint nicht die Antwort zu sein. Während es in foreach-Schleifen verwendet wird, haben die grundlegenden Array Iterator-Funktionen nicht die Methoden aufrufen.

War es hilfreich?

Lösung

Letzte Änderungen in PHP verhindern ArrayIterators manipulieren Form sind die Standard-Array-Funktionen verwenden (Reset, als nächstes, usw.).

Das sollte bald wieder hergestellt werden: http://news.php.net/php.internals/42015

Andere Tipps

Eine Möglichkeit, dies zu Arbeit zu bekommen, ist Ihre eigene Iterator in einer separaten Klasse zu definieren, und dann Hauptklasse sagen, dass neuen Iterator anstelle dem Standard zu verwenden.

class MyIterator implements Iterator {
  public function key() {
    //
  }

  public function rewind() {
    //
  }

  // etc.

}

class MyMainClass implements IteratorAggregate {
  private $_data = array();

  // getIterator is required for the IteratorAggregate interface.
  public function getIterator() {
    return new MyIterator($this->_data);
  }

  // etc.

}

Dann sollten Sie so viel Kontrolle haben, wie Sie benötigen. (Und Sie können Ihre eigene MyIterator über eine Reihe von Klassen wiederverwenden).

Keine Prüfung auf der oben getan, aber das Prinzip ist richtig, glaube ich.

Hope, das hilft!

ArrayIterator nicht, was Sie suchen zum? Oder wie wäre es Arrayobject , die SPL-Schnittstelle zu sein scheint für das, was Sie erreichen wollen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top