Comparing objects with == and ===

When comparing objects, == and === may not work quite as you expect them to. If you were comparing two integers of the same value (eg 5), then == and === would both return true, however with objects == compares the objects' contents and === compares the objects' handles.

There is a difference there, and it's crucial: if you create an object and clone it, its clone will have exactly the same values as it. It will, therefore, return true for == as the two objects are the same in terms of their values. However, if you use ===, you will get false back because it compares the handles of the object and finds them to be different. This code example shows it nicely:

<?php
    
class foo { }

    
$wom = new foo();
    
$bat = clone $wom;

    print (int)(
$wom == $bat) . "\n";
    print (int)(
$wom === $bat) . "\n";
?>

That will output a 1 then a 0, as expected. Now, apart from basic comparison differences, this also matters because very early versions of PHP 5 encountered problems when doing an == comparison in very specific objects. Take a look at this code:

<?php
    
class foo {
        public function
__construct() {
            
$this->myself = $this;
        }
    }

    
$wom = new foo();
    
$bat = clone $wom;

    print (int)(
$wom == $bat) . "\n";
    print (int)(
$wom === $bat) . "\n";
?>

So, what we have there is a class that puts a reference to itself in the $myself variable on construction. Naturally, this is a silly thing to do, but the example is simplified - in a real scenario it might store a reference to another object that has a reference back to itself, which would cause the same problem. If you execute that script, you won't get 1 and 0. Instead, you'll get "PHP Fatal error: Nesting level too deep - recursive dependency?" Why? Because with ==, PHP compares each individual value of the object, so it looks at the value of $myself, finds it to be an object, looks inside it, finds $myself, looks inside it, finds $myself, etc, etc, etc, and carries on looping.

The solution to this is to use === in the comparison, which will allow PHP to compare object handles and therefore immediately tell that the two objects are identical.

 

Next chapter: Saving objects >>

Previous chapter: Copying objects

Jump to:

 

Home: Table of Contents

Follow us on Identi.ca or Twitter

Username:   Password:
Create Account | About TuxRadar