Comparaison d'objets

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