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