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.
Example#1 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 ) )