lundi 9 mars 2009
En PHP, l'interface interne la plus simple à implémenter est sans aucun doute countable, qui est fournie de façon native avec la SPL (Standard PHP Library). Comme son nom l'indique, une classe qui implémente l'interface countable doit pouvoir être en mesure de compter ses items qui la compose.
Cette interface est simple car elle ne nécessite que l'implémentation de la méthode count(). Autrement dit, la classe que vous créez doit simplement posséder une fonction count() qui retourne le nombre d'éléments.
À la base, on sait qu'on peut compter les éléments d'une liste (array) :
echo count($arr);En utilisant un exemple tiré du site php.net, on voit que la représentation interne des données pourrait simplement être un entier statique :
class myCounter implements Countable {En définissant une autre classe pour gérer une liste d'épicerie, on pourrait conserver la liste de n'importe quelle façon. Ici, j'ai utilisé un array pour la représentation interne mais ça aurait pu être n'importe quoi.
public function count() {
static $count = 0;
return ++$count;
}
}
class GroceryList Implements Countable {Si je n'avais pas mis "Implements Countable" dans la définition de ma classe, count() n'aurait pas pu déterminer le nombre d'items dans la liste interne et aurait retourné 1 (1 étant l'objet lui-même. Sa méthode count() ne serait pas appelée). Dans ce cas, j'aurais pu utiliser $gl->count(); pour obtenir le bon nombre. Question de standardiser les objets qui se comptent, on est mieux d'implémenter countable.
private $someData;
public function __construct() {
$this->someData = array();
}
public function add($pItem, $pQty) {
$this->someData[] = array('name' => $pItem, 'qty' => $pQty);
}
public function count() {
$count = 0;
foreach($this->someData as $item) {
$count += $item['qty'];
}
return $count;
}
}
// type 1Dans l'exemple ci-dessus, tous les objets peuvent être comptés, ce qui permet de boucler sur tous les types d'objets qui se comptent (array, myCounter, GroceryList) puisque la méthode count() et commune et uniforme.
$list = array(1,2,3,4,5);
// type 2
$counter = new myCounter;
count($counter); // 1
count($counter); // 2
count($counter); // 3
// type 3
$gl = new GroceryList();
$gl->add('Hamburger buns', 12);
$gl->add('Ground beef', 2);
$gl->add('Relish', 1);
$gl->add('Ketchup', 1);
$gl->add('Mustard', 1);
// créer une liste qui contient différents objets qui peuvent se compter :
$countables = array();
$countables[] = $gl;
$countables[] = $list;
$countables[] = $counter;
foreach ($countables as $cnt) {
echo count($cnt);
}