Archives par étiquette : SplObjectStorage

Exemple simple avec SplObjectStorage

La classe SplObjectStorage est comme son nom l’indique issue de la SPL. Elle permet à l’instar des tableaux de stocker des collections d’objets. Cependant SplObjectStorage est nettement plus rapide qu’un simple tableau.Elle implémente de plus les interfaces Countable , Iterator , Traversable , Serializable , ArrayAccess qui rendent sont utilisation vraiment confortable.Voici un petit exemple pratique d’utilisation de cette class.Admettons que nous ayons une classe Groupe qui est charger de contenir plusieurs instance d’une classe Personne (un groupe composé de plusieurs personnes pour ceux qui suivent pas)
On commence par une classe Personne très simple :

class Personne
{
    private $nom;
    private $prenom;
    private $age;

    public function __construct($nom,$prenom,$age)
    {
        $this->nom      = $nom;
        $this->prenom   = $prenom;
        $this->age      = intval($age);
    }

    public function getAge()
    {
        return $this->age;
    }

}

Notre classe groupe étant supposée être une collection d’objet nous allons la faire dériver de SplObjectStorage :

class Groupe extends SplObjectStorage
{
    public function attach(Personne $personne)
    {
        parent::attach($personne);
    }

    public function detach(Personne $personne)
    {
        parent::detach($personne);
    }

    public function getMoyenneAge()
    {
        $nbObjet = $this->count();
        $total = null;
        foreach($this as $personne) {
            $total += $personne->getAge();
        }

        return floor($total / $nbObjet);
    }
}

On redéfini attach et detach pour n’accepter que des objet de type Personne (au lieu de n’importe quel objet).On ajoute ensuite une méthode qui va calculer la moyenne d’age du groupe.Pour celà il faut parcourir tous les objets de la collection. Un simple foreach suffit pour itérer sur le contenu de Groupe tout comme un simple count() nous retourne le nombre de Personne !
Ne reste ensuite plus qu’a créer quelques personnes et former un groupe :

$pierre = new Personne('Dupond','Pierre',30);
$paul   = new Personne('Dupont','Paul',28);
$jack   = new Personne('Dupon','Jack',60);

$groupe = new Groupe();
$groupe->attach($pierre);
$groupe->attach($paul);
$groupe->attach($jack);
echo $groupe->getMoyenneAge().'<br />';
//Jack décède tragiquement
$groupe->detach($jack);

echo $groupe->getMoyenneAge();