Clonación de Objetos
Object cloning
Crear una copia de un objeto que duplique todos los valores de sus propiedades no siempre funciona como esperamos. Un buen ejemplo esta en la necesidad de copiar construcciones, de esta forma si tienes un objeto que representa una ventana GtK y el objeto es una fuente a esta ventana GTK, y cuando lo creas o duplicas buscas crear una nueva instancia del objeto con las mismas propiedades y tienes un nuevo objeto que es una fuente a una nueva ventana Gtk.
Otro ejemplo es si su objeto mantiene una referencia a otro objeto que el usa y cuando lo duplicas el objeto padre, tu quieres crear una nueva instancia de este otro objeto asi que la replica tiene su copia por separado.
Una copia de un objeto es creada usando la palabra reservada clone (que llama el método del objeto __clone() si es posible). Un metodo de objeto __clone() no puede ser llamado directamente.
$copia_de_objeto = clone $objeto;
Cuando un objeto es clonado, PHP5 realizara una copia a bajo nvel de todas las propiedades del objeto. Cualquier propiedad que sea referencia a otras variables mantendrá su referencia. Si un metodo __clone() es definido, entonces cuando un nuevo objeto sea creado, este metodo será llamado para
controlar que propiedades deben ser cambiadas.
Ejemplo 19.31. Clonando un Objeto
Código PHP:
<?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()
{
// Forza a sacar una copia de of this->object, de otra forma
// apuntará al mismo objeto
$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 ejemplo anterior muestra:
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
)
)