PHP kézikönyv
Előző | 19. Fejezet. Osztályok és objektumok (PHP 5) | Következő

# 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 ) )`

Előző | Tartalom | Következő
A final kulcsszó | Fel | Comparing objects