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 querese 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.
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.
Ejemplo 19-29. 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 )
)
|
|