Creating a copy of an object with fully replicated properties is not
   always the wanted behavior. A good example of the need for copy
   constructors, is if you have an object which represents a GTK window and the
   object holds the resource of this GTK window, when you create a duplicate
   you might want to create a new window with the same properties and have the
   new object hold the resource of the new window. Another example is if your
   object holds a reference to another object which it uses and when you
   replicate the parent object you want to create a new instance of this other
   object so that the replica has its own separate copy.
  
   An object copy is created by using the clone keyword (which calls the
   object's __clone() method if possible). An object's __clone()  method
   cannot be called directly.
  
   When an object is cloned, PHP 5 will perform a shallow copy of all of the
   object's properties. Any properties that are references to other variables,
   will remain references. If a __clone() method is defined, then the newly
   created  object's __clone() method will be called, to allow any necessary
   properties that need to be changed.
  
Example 19-31. Cloning an object 
<?php class SubObject {     static $instances = 0;     public $instance;
      public function __construct() {         $this->instance = ++self::$instances;     }
      public function __clone() {         $this->instance = ++self::$instances;     } }
  class MyCloneable {     public $object1;     public $object2;
      function __clone()     {         // Force a copy of this->object, otherwise         // it will point to same object.         $this->object1 = clone($this->object1);     } }
  $obj = new MyCloneable();
  $obj->object1 = new SubObject(); $obj->object2 = new SubObject();
  $obj2 = clone $obj;
 
  print("Original Object:\n"); print_r($obj);
  print("Cloned Object:\n"); print_r($obj2);
  ?>
 |  
 The above example will output: 
Original Object: MyCloneable Object (     [object1] => SubObject Object         (             [instance] => 1         )
      [object2] => SubObject Object         (             [instance] => 2         )
  ) Cloned Object: MyCloneable Object (     [object1] => SubObject Object         (             [instance] => 3         )
      [object2] => SubObject Object         (             [instance] => 2         )
  )
 |  
  |