ученикам: ушел в отпуск до 15-го июня. в отпуске буду по возможности отвечать на вопросы, но могу пропадать

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

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

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

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

<?php $user = new User('Коля', 30); ?>

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

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

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

Посмотрим на примере:

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

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

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

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

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

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

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

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

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

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

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