Comparing objects

In PHP 5, object comparison is more complicated than in PHP 4 and more in accordance to what one will expect from an Object Oriented Language (not that PHP 5 is such a language).

When using the comparison operator ( == ), object variables are compared in a simple manner, namely: Two object instances are equal if they have the same attributes and values, and are instances of the same class.

On the other hand, when using the identity operator ( === ), object variables are identical if and only if they refer to the same instance of the same class.

An example will clarify these rules.

例子 19-30. Example of object comparison in 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
"Two instances of the same class\n" ;
compareObjects ( $o , $p );

echo
"\nTwo references to the same instance\n" ;
compareObjects ( $o , $q );

echo
"\nInstances of two different classes\n" ;
compareObjects ( $o , $r );
?>

上例将输出:

Two instances of the same class
o1 == o2 : TRUE
o1 != o2 : FALSE
o1 === o2 : FALSE
o1 !== o2 : TRUE

Two references to the same instance
o1 == o2 : TRUE
o1 != o2 : FALSE
o1 === o2 : TRUE
o1 !== o2 : FALSE

Instances of two different classes
o1 == o2 : FALSE
o1 != o2 : TRUE
o1 === o2 : FALSE
o1 !== o2 : TRUE