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.

 

Want to learn PHP 7?

Hacking with PHP has been fully updated for PHP 7, and is now available as a downloadable PDF. Get over 1200 pages of hands-on PHP learning today!

If this was helpful, please take a moment to tell others about Hacking with PHP by tweeting about it!

Next chapter: Saving objects >>

Previous chapter: Copying objects

Jump to:

 

Home: Table of Contents

Copyright ©2015 Paul Hudson. Follow me: @twostraws.