Prosleđivanje objekata po referenci u OOP u PHP-u

Neka nam je dat ovakav klasa User:

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

Neka kreiramo objekat ove klase:

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

Zamislite sada sledeću situaciju: želite vrednost promenljive $user da dodelite nekoj drugoj promenljivoj, na primer $test.

Da nije reč o objektima, već o primitivima, odnosno o stringovima, brojevima, nizovima i sl., onda bi u promenljivu $test otišla kopija vrednosti promenljive $user.

To znači da promene bilo koje od promenljivih ubuduće ne bi menjale vrednost druge promenljive. Pogledajmo na primeru:

index.php<?php
  $user = 1;
  
  $test = $user; // u promenljivoj $test sada je 1
  $test = 2;     // u promenljivoj $test sada je 2, a u $user - i dalje 1
?>

Kod objekata je drugačije - pri upisu u drugu promenljivu objekti se ne kopiraju, već se prosleđuju po referenci: to znači, da obe ove promenljive imaju za vrednost jedan te isti objekat. Ovo ima važnu posledicu: ako se promene neka svojstva objekta pomoću jedne promenljive, u drugoj promenljivoj pojaviće se te iste promene.

Pogledajmo u praksi. Kreirajmo objekat sa korisnikom:

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

Dodelimo objekat drugoj promenljivoj:

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

Promenimo svojstvo name u promenljivoj $test

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

Proverimo da li se promenio zajednički objekat. Ispišimo svojstvo name iz promenljive $user:

index.php<?php
  echo $user->name; // ispisaće 'eric'!
?>
Задание 1

Napravite klasu Product, u kojoj će biti sledeća svojstva: name, price.

Задание 2

Kreirajte objekat klase Product, zapišite ga u promenljivu $product1.

Задание 3

Dodelite vrednost promenljive $product1 u promenljivu $product2. Proverite da li obe promenljive referenciraju na jedan te isti objekat.