Comparaison d'objets
En PHP 5, la comparaison d'objets est plus complexe qu'en PHP 4, et plus proche du comportement que l'on pourrait attendre d'un langage orienté objet (sans aller jusqu'à dire que PHP 5 en soit un).
Lors de l'utilisation de l'opérateur de comparaison (==), les objets sont comparés de manière simple, à savoir : deux objets sont égaux s'ils ont les mêmes attributs et valeurs, et qu'ils sont des instances de la même classe.
D'un autre coté, lors de l'utilisation de l'opérateur d'identité (===), les objets sont identiques uniquement s'ils font référence à la même instance de la même classe.
Un exemple va illustrer ces règles.
Exemple #1 Exemple de comparaison d'objets en PHP
<?php function bool2str($bool) { if ($bool === false) { return 'FALSE'; } else { return 'TRUE'; } } function compareObjects(&$o1, &$o2) { echo 'o1 == o2 : '.bool2str($o1 == $o2)."\n"; echo 'o1 != o2 : '.bool2str($o1 != $o2)."\n"; echo 'o1 === o2 : '.bool2str($o1 === $o2)."\n"; echo 'o1 !== o2 : '.bool2str($o1 !== $o2)."\n"; } class Flag { public $flag; function Flag($flag = true) { $this->flag = $flag; } } class OtherFlag { public $flag; function OtherFlag($flag = true) { $this->flag = $flag; } } $o = new Flag(); $p = new Flag(); $q = $o; $r = new OtherFlag(); echo "Deux instances de la même classe\n"; compareObjects($o, $p); echo "\nDeux références sur le même objet\n"; compareObjects($o, $q); echo "\nInstances de classes différentes\n"; compareObjects($o, $r); ?>
L'exemple ci-dessus va afficher :
Deux instances de la même classe o1 == o2 : TRUE o1 != o2 : FALSE o1 === o2 : FALSE o1 !== o2 : TRUE Deux références sur le même objet o1 == o2 : TRUE o1 != o2 : FALSE o1 === o2 : TRUE o1 !== o2 : FALSE Instances de classes différentes o1 == o2 : FALSE o1 != o2 : TRUE o1 === o2 : FALSE o1 !== o2 : TRUE
Note:
Les extensions peuvent définir leurs propres règles pour leurs comparaisons d'objets (==).