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 ...
Get PHP in a Nutshell now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.