8.12. 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 simplifiedin 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?" 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., 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. This has been fixed in newer versions of PHP. |