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

Как уже неоднократно говорилось выше, в РНР объекты представляют собой ссылку. Во время присваивания ссылочных переменных объекты, на которые они ссылаются, уже не копируются - дублируются лишь сами ссылки.

Но что же делать, если нам в действительности нужно получить дубликат некоторого объекта, а не лишь еще одну ссылку на него? Для данных целей применяется ключевое слово clone (листинг 5).

Листинг 5 Встроенное клонирование объектов. Файл clone0.php

Переопределение операции клонирования

По умолчанию операция clone копирует данные объекта побитно. Однако для некоторых классов необходимо выполнить дополнительную работу, например, изменить значения некоторых свойств автоматически, сразу же после клонирования. В листинге 6 показано, как это можно сделать. Обратите внимание на специальный метод _clone(), который автоматически вызывается РНР при клонировании объектов.

Листинг 5 Переопределение функции клонирования. Файл clone.php

В момент вызова метода _clone() данные объекта уже скопированы в $this побитно. Вам достаточно изменить (или удалить) только нужные свойства, не трогая все остальные. В нашем примере мы изменяем свойство $dna (добавляем суффикс" (cloned) ") и не трогаем - $text.

Запрет клонирования

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


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: