Section 8.12. Comparing Objects with and


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.



PHP in a Nutshell
Ubuntu Unleashed
ISBN: 596100671
EAN: 2147483647
Year: 2003
Pages: 249

flylib.com © 2008-2017.
If you may any questions please contact us: flylib@qtcs.net