Objektum klónozás

Egy objektum másolatának az elkészítéséhez az összes tulajdonság teljes másolásával nem mindig eredményezi a várt viselkedést. Egy jó példa, amikor a konstruktorok másolata szükséges, ha neked van egy objektumod ami GTK ablakot képvisel, és te létre akarsz hozni egy új ablakot ugyanazokkal a tulajdonságokkal hogy az új objektum tárolja a forrását az új ablaknak. Másik példa ha a te objektumod referenciát tárol egy másik objektumhoz, és ha te létre akarsz hozni egy másolat objektumot, amiben ennek a másik objektumnak is külön másolata lesz.

Egy objektum másolatát a clone kulcsszó használatával lehet létrehozni (ami meghívja az objektum __clone() metódusát, ha lehetséges). Az objektum __clone() metódusa nem hívható meg közvetlenül.

$copy_of_object = clone $object;

Amikor egy objektum klónozott, a PHP 5 létrehoz egy felületes másolatot az objektum tulajdonságairól. Valamennyi tulajdonság, ami referencia más változókhoz, referencia fog maradni. Ha a _clone() metódus definiált, az újonnan elkészített objektum __clone() metódusa fog meghívódni, hogy engedélyezze bármely szükség esetén a tulajdonságok cseréjét.

Példa 19-31. Objektum klónozása

<?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()
    {
        
// Kényszerítjük a this->object másolatát, különben
        // ugyanarra az objektumra mutatna.
        
$this->object1 = clone($this->object1);
    }
}

$obj = new MyCloneable();

$obj->object1 = new SubObject();
$obj->object2 = new SubObject();

$obj2 = clone $obj;


print(
"Eredeti Objektum:\n");
print_r($obj);

print(
"Klónozott Objektum:\n");
print_r($obj2);

?>

A fenti példa a következő kimenetet adja:

Eredeti Objektum:
MyCloneable Object
(
    [object1] => SubObject Object
        (
            [instance] => 1
        )

    [object2] => SubObject Object
        (
            [instance] => 2
        )

)
Klónozott Objektum:
MyCloneable Object
(
    [object1] => SubObject Object
        (
            [instance] => 3
        )

    [object2] => SubObject Object
        (
            [instance] => 2
        )

)