L3 Info : PHP et Applications Web
 
◃  Ch. 6 SPL : Standard PHP Library  ▹
 

Interfaces Traversable et Iterator

  • Traversable : Interface permettant de détecter si une classe peut être parcourue en utilisant foreach. PDOStatement implémente Traversable.
  • Iterator : Interface pour les itérateurs.
    interface Iterator extends Traversable {
        /* Méthodes */
        abstract public mixed current ( void )
        abstract public scalar key ( void )
        abstract public void next ( void )
        abstract public void rewind ( void )
        abstract public boolean valid ( void )
        }
  • Source Classe Livre Iterator
    class LivreIterator implements Iterator, Countable {
    
      protected $idLivre = 1;
    
      public function count() {
        return LivreMetier::getNbLivres();
      }
    
      public function current() {
        return LivreMetier::initLivreMetier($this->idLivre);
      }
    
      public function key() {
        return $this->idLivre;
      }
    
      public function next() {
        $this->idLivre = $this->idLivre+1;
      }
    
      public function rewind (  ) {
        $this->idLivre = 1;
      }
    
      public function valid () {
        return $this->idLivre>0 && $this->idLivre<=$this->count();
      }
          }
  • Exécution exemple :
    $literator = new LivreIterator();
    echo "<h2/>Liste complète</h2>";
    echo "<ul>";
    foreach ($literator as $livre)
        echo "<li>".$literator->key()." = ".$livre->getLiv_num()." ".$literator->current()."</li>";
    echo "</ul>";
    echo "<br/><br/>";
    echo "<h2/>Décalage de 100 livres</h2>";
    $literator->rewind();
    for ($i=0;$i<100;$i++)
        $literator->next();
    echo "<ol>";
    while ($literator->valid()) {
        echo "<li>".$literator->key()." ".$literator->current()."</li>";
        $literator->next();
    }
    echo "</ol>";
    
    echo "<h2/>Focus sur les 7 premiers</h2>";
    $pageCourante = new LimitIterator($literator,0,7);
    
    echo "<ul>";
    foreach ($pageCourante as $val) {
        echo "<li>";
        echo $pageCourante->key()." ".$val;
        echo "</li> ";
    }
    echo "</ul>";