- 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>";