En PHP 4, les objets sont comparés de manière très simple, à savoir : deux instances sont égales si elles ont les mêmes attributs et valeurs, et qu'elles sont de la même classe. Des règles similaires s'appliquent lors de la comparaison avec l'opérateur === .
Si vous exécutez le code suivant :
Exemple 18.20. Exemple de comparaison d'objets en PHP 4
<?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
{
var
$flag
;
function
Flag
(
$flag
=
true
) {
$this
->
flag
=
$flag
;
}
}
class
SwitchableFlag
extends
Flag
{
function
turnOn
() {
$this
->
flag
=
true
;
}
function
turnOff
() {
$this
->
flag
=
false
;
}
}
$o
= new
Flag
();
$p
= new
Flag
(
false
);
$q
= new
Flag
();
$r
= new
SwitchableFlag
();
echo
"Compare des instances créées avec les mêmes paramètres\n"
;
compareObjects
(
$o
,
$q
);
echo
"\nCompare des instances créées avec différents paramètres\n"
;
compareObjects
(
$o
,
$p
);
echo
"\nCompare une instance d'un parent avec celle d'une sous-classe\n"
;
compareObjects
(
$o
,
$r
);
?>
L'exemple ci-dessus va afficher :
Compare des instances créées avec les mêmes paramètres o1 == o2 : TRUE o1 != o2 : FALSE o1 === o2 : TRUE o1 !== o2 : FALSE Compare des instances créées avec différents paramètres o1 == o2 : FALSE o1 != o2 : TRUE o1 === o2 : FALSE o1 !== o2 : TRUE Compare une instance d'un parent avec celle d'une sous-classe o1 == o2 : FALSE o1 != o2 : TRUE o1 === o2 : FALSE o1 !== o2 : TRUE
Même lorsque nous avons une composition d'objet, la même règle de comparaison s'applique. Dans l'exemple ci-dessous, nous allons créer une classe conteneur, qui stocke un tableau associatif Flag
.
Exemple 18.21. Comparaison d'objets composés en PHP 4
<?php
class
FlagSet
{
var
$set
;
function
FlagSet
(
$flagArr
= array()) {
$this
->
set
=
$flagArr
;
}
function
addFlag
(
$name
,
$flag
) {
$this
->
set
[
$name
] =
$flag
;
}
function
removeFlag
(
$name
) {
if (
array_key_exists
(
$name
,
$this
->
set
)) {
unset(
$this
->
set
[
$name
]);
}
}
}
$u
= new
FlagSet
();
$u
->
addFlag
(
'flag1'
,
$o
);
$u
->
addFlag
(
'flag2'
,
$p
);
$v
= new
FlagSet
(array(
'flag1'
=>
$q
,
'flag2'
=>
$p
));
$w
= new
FlagSet
(array(
'flag1'
=>
$q
));
echo
"\nObjects composés u(o,p) et v(q,p)\n"
;
compareObjects
(
$u
,
$v
);
echo
"\nu(o,p) et w(q)\n"
;
compareObjects
(
$u
,
$w
);
?>
L'exemple ci-dessus va afficher :
Objects composés u(o,p) et v(q,p) o1 == o2 : TRUE o1 != o2 : FALSE o1 === o2 : TRUE o1 !== o2 : FALSE u(o,p) et w(q) o1 == o2 : FALSE o1 != o2 : TRUE o1 === o2 : FALSE o1 !== o2 : TRUE