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;
Once the cloning is complete, 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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | <?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 ) )
Please login to continue.