Переход к PHP5 - Клонирование объектов

ОГЛАВЛЕНИЕ

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

В PHP4 для клонирования объекта достаточно было простой операции $clonedObject = $object. Все свойства обекта $object просто копировались в объект $clonedObject. Изменить алгоритм клоирования можно было написав собственный метод для этого. В PHP5 для этого метода ввели специальное имя __clone и упростили доступ к созданному объекту. Для обращения к новому объекту используется $this, для обращения к уже существующему (чей клон делается), соответственно, $that.

Если метода __clone нет, то вызовется стандартный метод, копирующий все свойства объекта.

На примере это выглядит так:

class Node {
private
$next;
private
$name;

function
__clone() {
$this->name = $that->name;
$this->next = null;
}

function
setName($name) { $this->name = $name; }
function
getName() { return $this->name; }
function
setNext(Node $next) { $this->next = $next; }
}

$n1 = new Node();
$n1->setName('Node1');

$n2 = new Node();
$n2->setName('Node2');
$n1->setNext($n2);

$n = $n2->__clone();
print_r($n);

В примере рассматривается класс для создания списка, т.е. цепочки объектов, в которой каждый объект сожержит указатель на следующий. При этом можно получить клон любого объекта в цепочке, и новый объект будет "вынутым" из цепочки (не содержать ссылки на следующий объект).

Пример также демонстрирует, что к можно внутри метода __clone можно получить доступ к private переменным объектов $this и $that.