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 the developer asks to create a new copy of an object, PHP 5 will check
if a __clone() method has been defined or not. If not, it will call a
default __clone() which will copy all of the object's properties. If a
__clone() method is defined, then it will be responsible to set the
necessary properties in the created object. For convenience, the engine
will supply a function that imports all of the properties from the source
object, so that they can start with a by-value replica of the source
object, and only override properties that need to be changed.
Ejemplo 14-5. Cloning an object
<?php class MyCloneable { static $id = 0;
function MyCloneable() { $this->id = self::$id++; }
function __clone() { $this->address = "New York"; $this->id = self::$id++; } }
$obj = new MyCloneable();
$obj->name = "Hello"; $obj->address = "Tel-Aviv";
print $obj->id . "\n";
$obj_cloned = clone $obj;
print $obj_cloned->id . "\n"; print $obj_cloned->name . "\n"; print $obj_cloned->address . "\n"; ?>
|
|