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

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

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

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

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

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

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

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

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

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

Давайте посмотрим на практике. Создадим объект с юзером:

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

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

index.php<?php
  $test = $user;
?>

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

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

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

index.php<?php
  echo $user->name; // выведет 'eric'!
?>
Задание 1

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

Задание 2

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

Задание 3

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