Клонирование объекта в PHP
Вход Регистрация

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

Оператор присваивания "=" не создаёт новую копию объекта и старый и новый объект указывают на одну и туже область памяти.

Продемонстрируем операцию присвоения одного объекта класса "classes_work" другому. При этом изменение члена класса нового объекта "$_class_new" будет отражаться на старом объекте "$classes_work".

Пример присвоения:


class classes_work {

	public $_work_variable;

	public function __construct () {
		$this->_work_variable = 10;
	}

}

$classes_work = new classes_work();

echo $classes_work->_work_variable;

// Присвоение одного объекта другому приводит не к созданию новой копии, а к получению текущим объектом дополнительного псевдонима
$_class_new = $classes_work;

$_class_new->_work_variable = 200;

echo $classes_work->_work_variable;
echo $_class_new->_work_variable;

Клонирование - это создание копии текущего объекта, которая выполняется с помощью специального слова "clone", которое располагается непосредственно перед клонируемым объектом.


class classes_work {

	public $_work_variable;

	public function __construct () {
		$this->_work_variable = 10;
	}

}

$classes_work = new classes_work();

// Получение независимой копии объекта посредством клонирования
$_class_new = clone $classes_work;

$_class_new->_work_variable = 200;

echo $classes_work->_work_variable; // Результат: 10
echo $_class_new->_work_variable; // Результат: 200

Оператор присваивания "=" не единственный способ создания псевдонима объекта. Псевдоним объекта можно создать при передачи самого объекта во внутрь функции. Массивы и объекты передаются во внутрь функции по ссылке в отличии от переменных которые передаются по значению. Это означает, что изменения, произведённые над объектом внутри функции, отражаются на объекте после выполнения функции.

Пример передачи объекта по ссылке в функцию:


class classes_work {

	public $_work_variable;

	public function __construct () {
		$this->_work_variable = 10;
	}

}

$classes_work = new classes_work();

function testfunc ($classes_work) {
	$classes_work->_work_variable = 'Принято значение созданное в функции "testfunc"';
}

testfunc ($classes_work);

echo $classes_work->_work_variable; // Результат: "Принято значение созданное в функции "testfunc"".

Для того чтобы передать объект по значению, как другую переменную, следует при вызове функции написать перед объектом слово "clone".


class classes_work {

	public $_work_variable;

	public function __construct () {
		$this->_work_variable = 10;
	}

}

$classes_work = new classes_work();

function testfunc ($classes_work) {
	echo $classes_work->_work_variable = 'Создана копия объекта "$classes_work"<br>';
}

testfunc (clone $classes_work);

echo $classes_work->_work_variable; // Результат: 10.

В примере внутрь функции передаётся не сам объект "$classes_work", а его копия, поэтому изменения, которые производятся над объектом, не отражаются на объекте в основной программе.


Комментировать

captcha

Вход

Зарегистрируйтесь, если нет учетной записи

Напомнить пароль
Регистрация
Напомнить пароль
Войти в личный кабинет