АКЦИЯ: бесплатные месячные курсы по созданию сайтов
на выбор: верстка, JavaScript, PHP или фреймворки. Сегодня последний день для записи! Жми!
⊗ppOpBsPOBR 23 of 107 menu
Бесплатная Тренировка Верстки. Приглашаются желающие поверстать!

Передача объектов по ссылке

Пусть у нас дан вот такой класс User:

<?php class User { public $name; public $age; public function __construct($name, $age) { $this->name = $name; $this->age = $age; } } ?>

Пусть мы создаем объект этого класса:

<?php $user = new User('john', 30); ?>

Представьте теперь следующую ситуацию: вы хотите значение переменной $user присвоить какой-нибудь другой переменной, например $test.

Если речь шла не об объектах, а о примитивах, то есть о строках, числах, массивах и тп, то в переменную $test попала бы копия значения переменной $user.

Это значит, что изменения любой из переменной в дальнейшем не меняли бы значение другой переменной. Посмотрим на примере:

<?php $user = 1; $test = $user; // в переменной $test теперь 1 $test = 2; // в переменной $test теперь 2, а в $user - по-прежнему 1 ?>

С объектами все по-другому - при записи в другую переменную объекты не копируются, а передаются по ссылке: это значит, что обе эти переменные значением имеют один и тот же объект. Это имеет важное следствие: если поменять какие-то свойства объекта с помощью одной переменной, во второй переменной появятся эти же изменения:

<?php $user = new User('john', 30); $test = $user; // и $test, и $user ссылаются на один и тот же объект $test->name = 'eric'; // поменяли переменную $test - но $user также поменялась! // Проверим - выведем свойство name из переменной $user: echo $user->name; // выведет 'eric'! ?>

Учтите, что речь идет именно об объектах. Если вы в какую-то переменную запишите данные из свойства объекта - они скопируются, а не передадутся по ссылке:

<?php $user = new User('john', 30); $name = $user->name; // запишем в переменную $name текст 'john' $name = 'eric'; // поменяли переменную $name, но $user->name не поменялось // Проверим - выведем свойство name из переменной $user: echo $user->name; // выведет 'john' ?>

Если перезаписать переменную с объектом на примитив, то объект не исчезнет из другой переменной:

<?php $user = new User('john', 30); $test = $user; // и $test, и $user ссылаются на один и тот же объект $user = 123; // теперь $test ссылается, а $user - нет ?>

Объект существует в памяти компьютера до тех пор, пока на него ссылается хоть кто-нибудь. В примере выше, если что-нибудь записать и в переменную $user - на наш объект больше не будет ссылаться ни одна переменная и этот объект удалится из памяти.

Сделайте класс Product, в котором будут следующие свойства: name, price.

Создайте объект класса Product, запишите его в переменную $product1.

Присвойте значение переменной $product1 в переменную $product2. Проверьте то, что обе переменные ссылаются на один и тот же объект.