Manuel PHP

Parcours d'objets

PHP 5 fournit une façon de définir les objets de manière à ce qu'on puisse parcourir une liste de membres avec une structure foreach. Par défaut, toutes les propriétés visibles seront utilisées pour le parcours.

Example#1 Parcours d'objet simple

  1. <?php
  2. class MyClass  
  3. {  
  4. public $var1 = 'valeur 1';  
  5. public $var2 = 'valeur 2';  
  6. public $var3 = 'valeur 3';  
  7.  
  8. protected $protected = 'variable protégée';  
  9. private $private = 'variable privée';  
  10.  
  11. function iterateVisible() { 
  12.    echo "MyClass::iterateVisible:\n"; 
  13.    foreach($this as $key => $value) { 
  14.       print "$key=>$value\n"; 
  15.    }  
  16. }  
  17. }  
  18.  
  19. $class = new MyClass();  
  20.  
  21. foreach($class as $key => $value) { 
  22.    print "$key=>$value\n";  
  23. }  
  24. echo "\n";  
  25.  
  26.  
  27. $class->iterateVisible(); 

L'exemple ci-dessus va afficher :

var1 => valeur 1 var2 => valeur 2 var3 => valeur 3 MyClass::iterateVisible: var1 => valeur 1 var2 => valeur 2 var3 => valeur 3 protected => variable protégée private => variable privée

Comme nous le montre l'affichage, l'itération foreach affiche toutes les variables visibles disponibles. Pour aller plus loin, vous pouvez implémenter l'interface interne de PHP 5 nommée Iterator. Ceci permet de déterminer comment l'objet doit être parcouru.

Example#2 Itération d'un objet implémentant un itérateur

  1. <?php
  2. class MyIterator implements Iterator  
  3. {  
  4. private $var = array();  
  5.  
  6. public function __construct($array)  
  7. { 
  8.    if (is_array($array) ) { 
  9.    $this->var = $array; 
  10.    }  
  11. }  
  12.  
  13. public function rewind() { 
  14.    echo "rembobinage\n"; 
  15.    reset($this->var);  
  16. }  
  17.  
  18. public function current() { 
  19.    $var = current($this->var); 
  20.    echo "actuel :$var\n"; 
  21.    return $var;  
  22. }  
  23.  
  24. public function key() { 
  25.    $var = key($this->var); 
  26.    echo "clé :$var\n"; 
  27.    return $var;  
  28. }  
  29.  
  30. public function next() { 
  31.    $var = next($this->var); 
  32.    echo "suivant :$var\n"; 
  33.    return $var;  
  34. }  
  35.  
  36. public function valid() { 
  37.    $var = $this->current() !== false; 
  38.    echo "valide :{$var}\n"; 
  39.    return $var;  
  40. }  
  41. }  
  42.  
  43. $values = array(1,2,3);  
  44. $it = new MyIterator($values);  
  45.  
  46. foreach ($it as $a => $b) { 
  47.    print "$a:$b\n";  
  48. } 

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'ait pas besoin de définir toutes les fonctions Iterator en implémentant simplement l'interface PHP 5 IteratorAggregate.

Example#3 Itération d'un objet implémentant IteratorAggregate

  1. <?php
  2. class MyCollection implements IteratorAggregate  
  3. {  
  4. private $items = array();  
  5. private $count = 0;  
  6.  
  7. // Définition requise de l'interface IteratorAggregate
  8. public function getIterator() { 
  9.    return new MyIterator($this->items);  
  10. }  
  11.  
  12. public function add($value) { 
  13.    $this->items[$this->count++] = $value;  
  14. }  
  15. }  
  16.  
  17. $coll = new MyCollection();  
  18. $coll->add('valeur 1');  
  19. $coll->add('valeur 2');  
  20. $coll->add('valeur 3');  
  21.  
  22. foreach ($coll as $key => $val) { 
  23.    echo "clé/valeur : [$key->$val]\n\n";  
  24. }  
  25. ?> 

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 :

Note: Pour plus d'exemples sur le parcours d'objets, lisez la section sur l'extension SPL.


Remonter Remonter
L'éditeur javascript - CSS - Gentoo - Tutoriaux PHP - Tutoriels PHP - Breizh Blog