Domanda

Ho un oggetto che implementa ArrayAccess , Iterator e Contabile . Ciò produce un mascheramento dell'array quasi perfetto. Posso accedervi con offset ( $ object [foo] ), posso buttarlo in un < code> foreach -loop e molte altre cose.

Ma ciò che non posso fare è darlo alle funzioni iteratore dell'array nativo ( next () , reset () , current () , key () ), anche se ho implementato i metodi richiesti da Iterator. PHP sembra tentare ostinatamente di iterare attraverso le sue variabili membro e ignora completamente i metodi iteratori.

Esiste un'interfaccia che aggancerebbe l'oggetto alle restanti funzioni di array-traversing o sono bloccato con quello che ho?

Aggiornamento: IteratorAggregate non sembra neanche la risposta. Mentre è usato in foreach -loops, le funzioni di iteratore dell'array di base non chiamano i metodi.

È stato utile?

Soluzione

Le recenti modifiche a PHP impediscono la manipolazione del modulo ArrayIterators utilizzando le funzioni di array standard (reset, successivo, ecc.)

Questo dovrebbe essere ripristinato presto: http://news.php.net/php.internals/42015

Altri suggerimenti

Un modo per farlo funzionare è definire il proprio iteratore in una classe separata, quindi dire alla propria classe principale di utilizzare quel nuovo iteratore invece di quello predefinito.

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

  public function rewind() {
    //
  }

  // etc.

}

class MyMainClass implements IteratorAggregate {
  private 

Un modo per farlo funzionare è definire il proprio iteratore in una classe separata, quindi dire alla propria classe principale di utilizzare quel nuovo iteratore invece di quello predefinito.

<*>

Quindi dovresti avere tutto il controllo di cui hai bisogno. (E puoi riutilizzare il tuo MyIterator in diverse classi).

Nessun test fatto su quanto sopra, ma credo che il principio sia corretto

Spero che questo aiuti!

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

Quindi dovresti avere tutto il controllo di cui hai bisogno. (E puoi riutilizzare il tuo MyIterator in diverse classi).

Nessun test fatto su quanto sopra, ma credo che il principio sia corretto

Spero che questo aiuti!

ArrayIterator non è quello che stai cercando per? O che dire di ArrayObject , che sembra essere l'interfaccia di SPL per quello che stai cercando di ottenere.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top