Comparer des objets

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

   

Ce qui est le résultat que nous attendions, au vu des règles édictées. Seules deux instances avec les mêmes valeurs d'attributs, et issues de la même classe, sont considérées comme égales.

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