Question

J'ai un objet qui implémente ArrayAccess , Iterator et Countable . Cela produit un masquage de tableau presque parfait. Je peux y accéder avec des décalages ( $ object [foo] ), je peux le jeter dans un < code> foreach - et bien d’autres choses encore.

Mais ce que je ne peux pas faire est de le donner aux fonctions d'itérateur de tableau natif ( next () , reset () , current () , key () ), même si j'ai implémenté les méthodes requises à partir d'Iterator. PHP semble essayer obstinément de parcourir ses variables membres et ignore totalement les méthodes itérateur.

Existe-t-il une interface qui relierait l'objet aux fonctions de traversée de tableaux restantes, ou suis-je collé à ce que j'ai?

Mise à jour: IteratorAggregate ne semble pas être la solution non plus. Bien qu'il soit utilisé dans les balises foreach , les fonctions d'itérateur de tableau de base n'appellent pas les méthodes.

Était-ce utile?

La solution

Les récentes modifications de PHP empêchent la manipulation du formulaire ArrayIterators à l'aide des fonctions de tableau standard (reset, next, etc.).

Ceci devrait être restauré bientôt: http://news.php.net/php.internals/42015

Autres conseils

Pour que cela fonctionne, définissez votre propre itérateur dans une classe distincte, puis indiquez à votre classe principale d'utiliser ce nouvel itérateur au lieu de celui par défaut.

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

  public function rewind() {
    //
  }

  // etc.

}

class MyMainClass implements IteratorAggregate {
  private 

Pour que cela fonctionne, définissez votre propre itérateur dans une classe distincte, puis indiquez à votre classe principale d'utiliser ce nouvel itérateur au lieu de celui par défaut.

<*>

Ensuite, vous devriez avoir autant de contrôle que nécessaire. (Et vous pouvez réutiliser votre propre MyIterator dans plusieurs classes).

Aucun test n’a été effectué sur ce qui précède, mais le principe est correct, je crois.

J'espère que ça aide!

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

Ensuite, vous devriez avoir autant de contrôle que nécessaire. (Et vous pouvez réutiliser votre propre MyIterator dans plusieurs classes).

Aucun test n’a été effectué sur ce qui précède, mais le principe est correct, je crois.

J'espère que ça aide!

ArrayIterator ne correspond-il pas à vos attentes? pour? Ou qu'en est-il de ArrayObject , qui semble être l'interface de SPL pour ce que vous essayez d'atteindre.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top