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.

Exemple 19.22. Parcours d'objet simple

<?php
class  MyClass 
{
  public 
$var1  'valeur 1' ;
  public 
$var2  'valeur 2' ;
  public 
$var3  'valeur 3' ;

  protected 
$protected  'variable protégée' ;
  private   
$private    'variable privée' ;

  function 
iterateVisible () {
     echo 
"MyClass::iterateVisible:\n" ;
     foreach(
$this  as  $key  =>  $value ) {
         print 
"$key => $value\n" ;
     }
  }
}

$class  = new  MyClass ();

foreach(
$class  as  $key  =>  $value ) {
    print 
"$key => $value\n" ;
}
echo 
"\n" ;


$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.

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

Exemple 19.24. 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" ;
}
?>

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 .