PHP 5 fournit une façon pour les objets d'être définis, donc
il est possible d'itérer à travers une liste d'éléments, avec, par exemple,
une la section intitulée foreach dans Chapitre 15 structure. Par défaut,
toutes les propriétés publiques seront utilisées pour cette itération.
Exemple 18-14. Un objet simple itéré
<?php
class MyClass { public $var1 = 'valeur 1'; public $var2 = 'valeur 2'; public $var3 = 'valeur 3';
protected $protected = 'protégé'; private $private = 'privé';
}
$class = new MyClass();
foreach($class as $key => $value) { print "$key => $value\n"; }
|
L'exemple ci-dessus va afficher :
var1 => valeur 1 var2 => valeur 2 var3 => valeur 3
|
|
Comme nous le montre l'affichage, la section intitulée foreach dans Chapitre 15 l'itération
affiche chaque variable publique définie. Pour aller plus loin,
vous pouvez implémenter un des la section intitulée Interfaces itérateurs
nommés interne à PHP 5. Celà permet à l'objet de décider quoi et quand l'objet doit être itéré.
Exemple 18-15. Itération d'un objet implémentant un itérateur
<?php class MyIterator implements Iterator {
private $var = array();
public function __construct($array) { if (is_array($array) ) { $this->var = $array; } }
public function rewind() { echo "rembobinage\n"; reset($this->var); }
public function current() { $var = current($this->var); echo "actuel : $var\n"; return $var; }
public function key() { $var = key($this->var); echo "clé : $var\n"; return $var; }
public function next() { $var = next($this->var); echo "suivant : $var\n"; return $var; }
public function valid() { $var = $this->current() !== false; echo "valide : {$var}\n"; return $var; }
}
$values = array(1,2,3); $it = new MyIterator($values);
foreach ($it as $a => $b) { print "$a: $b\n"; }
|
L'exemple ci-dessus va afficher :
rembobinage actuel : 1 valide : 1 actuel : 1 clé : 0 0: 1 suivant : 2 actuel : 2 valide : 1 actuel : 2 clé : 1 1: 2 suivant : 3 actuel : 3 valide : 1 actuel : 3 clé : 2 2: 3 suivant : actuel : valide :
|
|
Vous pouvez également définir votre classe de façon à ce qu'elle
n'a pas besoin de définir toutes les fonctions Iterator
en implémentant simplement l'interface PHP 5 IteratorAggregate.
Exemple 18-16. Itération d'un objet implémentant IteratorAggregate
<?php class MyCollection implements IteratorAggregate { private $items = array(); private $count = 0;
/* Définition requise de l'interface IteratorAggregate */ public function getIterator() { return new MyIterator($this->items); }
public function add($value) { $this->items[$this->count++] = $value; }
}
$coll = new MyCollection(); $coll->add('valeur 1'); $coll->add('valeur 2'); $coll->add('valeur 3');
foreach ($coll as $key => $val) { echo "clé/valeur : [$key -> $val]\n\n"; }
?> </pre>
|
L'exemple ci-dessus va afficher :
rembobinage actuel : valeur 1 valide : 1 actuel : valeur 1 clé : 0 clé/valeur : [0 -> valeur 1]
suivant : valeur 2 actuel : valeur 2 valide : 1 actuel : valeur 2 clé : 1 clé/valeur : [1 -> valeur 2]
suivant : valeur 3 actuel : valeur 3 valide : 1 actuel : valeur 3 clé : 2 clé/valeur : [2 -> valeur 3]
suivant : actuel : valide :
|
|