En PHP 5, la comparaison d'objets est plus compliquée qu'en PHP 4 afin d'être plus proche du comportement des langages orientés objet (bien que PHP n'en soit pas un).
Lors de l'utilisation de l'opérateur de comparaison == , les objets sont comparées 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 19.32. Exemple de comparaison d'objets en PHP 5
<?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