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 (e.g., 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. 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 objects and finds them to be different. This code example demonstrates this:
class Employee { }
$Bob = new Employee();
$Joe = clone $Bob;
print (int)($Bob == $Joe) . "\n";
print (int)($Joe === $Joe) . "\n";That will output a 1, then a 0. Apart from basic comparison differences, this also matters because versions of PHP at 5.0.2 and earlier can encounter problems when doing a = = comparison in very specific objects, like this:
class Employee {
public function _ _construct() {
$this->myself = $this;
}
}
$Bob = new Employee();
$Joe = clone $Bob;
print (int)($Bob == $Joe) . "\n";
print (int)($Bob === $Joe) . "\n";There is a class that puts a reference to itself in the $myself property 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 ...