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();
Tiens, je cherchais justement des benchmarks. Quand tu dis que «SplObjectStorage est nettement plus rapide qu’un simple tableau», tu as des chiffres ? Tu dis ça dans quel contexte ? Le parcours de tous les éléments avec un foreach, ou d’autres types de manipulations ?
SplObjectStorage est plus rapide quand on veut insérer (attach) un objet dans la collection ou vérifier son existance (contain). Tout simplement parce que on travail directement avec du code C optimisé pour ces actions.
Plus d’info avec un exemple de bench : http://technosophos.com/content/set-objects-php-arrays-vs-splobjectstorage
Merci je cherchais justement quelque chose de plus rapide que les tableaux