Другой задачей метода "__clone()" является управление клонированием сложного объекта, который имеет в своём составе другие объекты. Дело в том, что такие вложенные объекты не клонируются, для них просто создаётся псевдоним. Таким образом, несмотря на то, что создаются две независимые копии главного объекта, они по-прежнему указывают на один и тот же подобъект (см. рисунок).

Приведём пример, в котором создадим класс "ByClasses" который будет содержать в своём составе объект "subObject" класса "subClass".


class ByClasses {

	public $subObject, $_work;

	public function __construct() {
		$this->subObject = new subClass();
		$this->_work = 'Член класса - '. __CLASS__;
	}

}

class subClass {

	public $_work;

	public function __construct() {
		$this->_work = 'Член класса - '. __CLASS__;
	}

}

$_Class_ByClasses = new ByClasses();
$_new_Class_ByClasses = clone $_Class_ByClasses;

$_new_Class_ByClasses->_work = 999;
$_new_Class_ByClasses->subObject->_work = 999;

echo $_Class_ByClasses->_work; # Результат: Член класса - ByClasses;

echo '<hr>';

echo $_Class_ByClasses->subObject->_work; # Результат: 999;

Следует отметить, что клонируется только непосредственные члены класса "ByClasses", внутренняя структура вложенного класса "subClass" не клонируется. Для того чтобы исправить такую ситуацию, объект "$subObject" необходимо клонировать явно в методе "__clone()".

Клонирование вложенного класса:


class subClass {

	public $_work;

	public function __construct() {
		$this->_work = 'Член класса - '. __CLASS__;
	}

}

class ByClasses {

	public $subObject, $_work;

	public function __construct() {
		$this->subObject = new subClass();
		$this->_work = 'Член класса - '. __CLASS__;
	}

	public function __clone() {
		$this->subObject = clone $this->subObject;
	}

}

$_Class_ByClasses = new ByClasses();
$_new_Class_ByClasses = clone $_Class_ByClasses;

$_new_Class_ByClasses->_work = 999;
$_new_Class_ByClasses->subObject->_work = 999;

// Клонируются все члены, в том числе и вложённых классов.
echo $_Class_ByClasses->_work; # Результат: Член класса - ByClasses;

echo '<hr>';

echo $_Class_ByClasses->subObject->_work; # Результат: Член класса - subClass;

Псевдоним вложенного объекта.
Псевдоним вложенного объекта.

captcha

Антипкин Михаил Сергеевич о метавселенной, открывающей безграничные возможности для инноваций и экспериментов Антипкин Михаил Сергеевич о метавселенной
Сёрфинг с браузером FraudFox: исчерпывающее руководство Сёрфинг с браузером FraudFox
Где найти лицензионные ключи активации к ПО? Где найти лицензионные ключи активации к ПО?
Курсы веб дизайна: обучение онлайн Курсы веб дизайна: обучение онлайн
Как продлить срок службы бытовой техники? Как продлить срок службы бытовой техники?
Основы VPS/VDS: что нужно знать перед арендой? Основы VPS/VDS: что нужно знать перед арендой?
Откройте для себя азарт Mostbet KZ - ведущего онлайн-казино для геймеров Откройте для себя азарт Mostbet KZ - ведущего онлайн-казино для геймеров
Топ-10 игр для Android стоимостью менее $5 Топ-10 игр для Android стоимостью менее $5
Проверка авто в базе ГИБДД перед покупкой Проверка авто в базе ГИБДД перед покупкой
Бизнес-психология в онлайн-институте Smart Бизнес-психология в онлайн-институте Smart
Как открыть расчётный счёт в банке для ИП и ООО? Как открыть расчётный счёт в банке для ИП и ООО?
Завис айфон: что делать? Завис айфон: что делать?
Обзор смартфона iPhone 15 Обзор смартфона iPhone 15
Системы видеонаблюдения в частном доме: характеристики и настройка Системы видеонаблюдения в частном доме: характеристики и настройка
Что такое партнёрская программа? Что такое партнёрская программа?
Анализируем рекламу Google Ads для оптимизации кампаний Анализируем рекламу Google Ads для оптимизации кампаний
Аренда сервера в immers.cloud Аренда сервера в immers.cloud
Мастерство самоорганизации: 5 приемов для успешного планирования Мастерство самоорганизации: 5 приемов для успешного планирования
Взлом голосовых помощников ультразвуком Взлом голосовых помощников ультразвуком
Как создавать промпты для ChatGPT: главные правила Как создавать промпты для ChatGPT: главные правила