Clonado de Objetos

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.

Ejemplo 19-30. Clonando un objeto
<?phpclass 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
        )

)

No response to “Clonado de Objetos”