search for in the  
<Final KeywordComparing objects>
Last updated: Thu, 19 May 2005

Object cloning

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.

$copy_of_object = clone $object;

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-29. 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
       )

)


User Contributed Notes
Object cloning
jorge dot villalobos at gmail dot com
30-Mar-2005 06:29
I think it's relevant to note that __clone is NOT an override. As the example shows, the normal cloning process always occurs, and it's the responsibility of the __clone method to "mend" any "wrong" action performed by it.

<Final KeywordComparing objects>
 Last updated: Thu, 19 May 2005
Copyright © 2001-2005 The PHP Group
All rights reserved.
This unofficial mirror is operated at: The Server Pages
Last updated: Thu May 19 18:35:34 2005 EDT