Класове и обекти (PHP 5)
PHP Manual

Клониране на обекти

Създаването на копие на обект с абсолютно идентични свойства не винаги е желаният вариант. Добър пример за необходимостта от копиране на конструкторите е ситуацията, в която имате обект, който представлява GTK прозорец и съдържа ресурсите на този GTK прозорец. Когато създадете копие на този обект, може да искате да създадете нов прозорец със същите свойства и новият обект да съдържа ресурсите на новия прозорец. Като друг пример може да послужи ситуацията, в която вашият обект използва референция към друг обект, който използва и когато създадете копие на родителския обект, искате да се създаде нова инстанция и на другия обект, така че и той да си има свое собствено копие.

Копие на обект се създава посредством ключовата дума clone (която извиква метода __clone() на обекта, ако е възможно). Методът __clone() не може да бъде извикан директно.

$copy_of_object = clone $object;

Когато се създаде копие на обекта, PHP5 ще създаде нова инстанция на обекта, с негово собствено копие на свойствата. Всички свойства, които са референции към други променливи ще си останат референции, т.е. няма да се извърши дълбочинно копиране. Ако е дефиниран метод __clone(), ще бъде извикан метода __clone() на новосъздадения обект, за да може в случай на нужда да се променят стойностите на някои свойства.

Example #1 Клониране на обект

<?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()
    {
        
// Принуждава създаването на копие на $this->object, в противен случай
        // ще сочи към същия обект.
        
$this->object1 = clone $this->object1;
    }
}

$obj = new MyCloneable();

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

$obj2 = clone $obj;


print(
"Оригинален обект:\n");
print_r($obj);

print(
"Клониран обект:\n");
print_r($obj2);

?>

Примерът по-горе ще изведе:

Оригинален обект:
MyCloneable Object
(
    [object1] => SubObject Object
        (
            [instance] => 1
        )

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

)
Клониран обект:
MyCloneable Object
(
    [object1] => SubObject Object
        (
            [instance] => 3
        )

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

)

Класове и обекти (PHP 5)
PHP Manual