Предаване на обекти по референция в ООП в 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. Проверете това, че и двете променливи сочат към един и същи обект.