Ver Mensaje Individual
  #39 (permalink)  
Antiguo 30/03/2007, 22:59
Avatar de anthemfor182
anthemfor182
 
Fecha de Ingreso: enero-2006
Ubicación: Colombia
Mensajes: 73
Antigüedad: 19 años
Puntos: 2
Re: Traduccion POO en PHP5 (version BETA)

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
        )

)

Última edición por anthemfor182; 30/03/2007 a las 23:14 Razón: error