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

Присвоение одного объекта другому в PHP

Большинство объектов представляют собой довольно сложные конструкции, которые могут содержать массивы или другие объекты. Это вызывает необходимость оперировать не самими объектами, а ссылками на области памяти, в которой они хранятся. В соответствии с этим присвоение одного объекта другому приводит к получению не двух независимых объектов, а двух имён переменных, каждая из которых содержит ссылку на один и тот же объект и ту же область памяти. Объектно-ориентированная модель PHP не предусматривает перегрузку операторов, и разработчик не может переопределять их поведение для объектов.

На примере класса "myEffect" содержащий один единственный открытый член, мы продемонстрируем этот эффект.


class myEffect {
	public $_element;
}

$_start = new myEffect();
$_next = new myEffect();

$_start->_element = 'TRUE_start';
$_next = $_start; # Присвоение одного объекта другому не приводит к созданию его копии;
$_next->_element = 'TRUE_next';

echo $_start->_element; # Результат: TRUE_next ;

В результате работы скрипта будет выведено значение "TRUE_next". После того как объект "$_start" присвоен второму объекту "$_next", изменение одного из объектов приводит к изменению обоих объектов одновременно. Присвоение объекта в качестве значения может выполняться не только явным образом при помощи оператора "=", но и неявно, например, передачей объекта функции в качестве аргумента. Все объекты и массивы (с версии 5), автоматически передаются в функцию по ссылке. Это означает, что все изменения, которые функция производит с объектом сохраниться и после её завершения.

Приведём пример передачи объекта класса "myEffect" функции, где происходит изменение состояния объекта. Передача объекта функции в качестве аргумента:


class myEffect {
	public $_element;
}

$_Class_myEffect = new myEffect();
$_Class_myEffect->_element = 9999;
$_element = 9999;

function effect ($_element, $_Class_myEffect) {
	$_Class_myEffect->_element = '<div>Новое значение</div>';
	$_element = 10000;
}

effect($_element, $_Class_myEffect);

echo $_Class_myEffect->_element; # Результат: Новое значение;
echo $_element; # Результат: 9999;

Как видно из примера, функция "effect()" не может изменить значение обычной переменной "$_element", которая передаётся ей в качестве аргумента, тем не менее, объект "$_Class_myEffect" претерпевает изменения. Следует отметить, что хотя массивы, так же как и объекты, передаются по ссылке, они ведут себя подобно обычным переменным, то есть не подвергаются изменению во внешнем коде, если элементы подвергались изменению внутри функции.


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

captcha

  #1 / Гость
03 мая 2012 / Ответить  

О клонировании объектов автор не подозревает...

  #2 / codomaza
04 мая 2012 / Ответить  

Нужно знать разные способы и подходы к решению задачи, о клонировании объектов в PHP автор знает, готовится статья...

  #3 / i-tillad
04 мая 2012 / Ответить  

Подозреваю, тут уже давненько статья есть про клонирование объекта.

Вход

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

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