Crear una copia de un objeto con una replica de todas sus propiedades no es siempre lo que se desea hacer. Un buen ejemplo de la necesidad de copiar los constructores, es si se tiene un objeto el cual representa una ventana GTK y el objeto contiene los recursos de esta ventana GTK, cuando se crea un duplicado, puede quererse crear una nueva ventana con las mismas propiedades y hacer que el nuevo objeto tenga los recursos de la ventana nueva. Otro ejemplo es si su objeto tiene la referencia a otro objeto el cual usa, y cuando se duplica el objeto padre, quiere crear una nueva instancia de este otro objeto así que la replica tiene su propia copia.
Una copia de un objeto es creada usando la palabra 'clone' (la cual llama el método __clone() del objeto, si es posible). Un método __clone() de un objeto no puede ser llamado directamente.
$copy_of_object = clone $object;
Cuando un objeto es clonado, PHP 5 informará una copia baja de todas las propiedades del objeto. Cualquier propiedad que sean referencias a otras variables, permanecerán siendo referencias. Si un método __clone() es definido, entonces el método __clone() del nuevo objeto creado será llamado, para permitir cualquier propiedad que tenga que ser cambiada.
Example#1 Clonando un objeto
<?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);
?>
El resultado del ejemplo seria:
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 ) )