ВНИМАНИЕ: Запись на курсы по HTML, CSS, JavaScript, PHP, Python, React, Vue, Laravel и другим фреймворкам и CMS,
а также: помощь в поиске работы и заказов, стажировка на реальных проектах→
⊗ppOpAdPBR 23 of 107 menu
Бесплатный курс по выкладке сайтов на хостинг. Разбираем все нюансы! Начало 14 октября. Жми для записи!

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

Пусть у нас дан вот такой класс 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); ?>

Присвоим объект в другую переменную:

<?php $test = $user; ?>

Поменяем свойство name в переменной $test

<?php $test->name = 'eric'; ?>

Давайте проверим, что изменился общий объект. Выведем свойство name из переменной $user:

<?php echo $user->name; // выведет 'eric'! ?>

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

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

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

byenru