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.



Copyright 2012 Future Publishing Limited (company
registered number 2008885), a company registered
in England and Wales whose registered office is at
Beauford Court, 30 Monmouth Street, Bath, BA1 2BW, UK