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


add a note add a note User Contributed Notes
donny at semeleer dot nl
14-Sep-2006 04:56
In a reaction to Jony dos Santos Kostetzer.

It does matter if they have different values. You're using the method Flag within the class Flag. This method returns the given parameter or, if no parameter is set, true.

The comparison functions compares the 2 outcomes. In your example true and 10. In PHP this would be similar to :

<?php

if (true == 10)
{
   return
true ;
}

?>

Which would return true. So you could say that the values have the same outcome even though the input is visibly not the same.

Another example :

<?php

/* ... */
$o = new Flag(1);
$p = new Flag(10);

/* ... */
echo "Two instances of the same class\n";
compareObjects($o, $p);

?>

output:

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

as can be expected.
jony AT jonysk DOT net
28-Aug-2006 02:23
"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."

Actually, it doesn't matter if they have different values:

<?php
/* ... */
$o = new Flag();
$p = new Flag(10);

/* ... */
echo "Two instances of the same class\n";
compareObjects($o, $p);
?>

output:

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

Jony dos Santos Kostetzer