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 #1 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
)
)
© 2005-2008 BlaBla.cn 版权所有