Переход к 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.