Posredovanje objektov po referenci v OOP v PHP

Recimo, da imamo podan razred User:

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

Recimo, da ustvarimo objekt tega razreda:

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

Zdaj pa si predstavljajte naslednjo situacijo: želite vrednost spremenljivke $user prirediti kakšni drugi spremenljivki, na primer $test.

Če ne bi šlo za objekte, ampak za primitivne tipe, to je nize, števila, tabele itd., bi v spremenljivko $test šla kopija vrednosti spremenljivke $user.

To pomeni, da spremembe katere koli spremenljivke v nadaljevanju ne bi spremenile vrednosti druge spremenljivke. Poglejmo si primer:

index.php<?php
  $user = 1;
  
  $test = $user; // v spremenljivki $test je zdaj 1
  $test = 2;     // v spremenljivki $test je zdaj 2, v $user pa še vedno 1
?>

Z objekti je drugače - pri zapisovanju v drugo spremenljivko se objekti ne kopirajo, ampak se posredujejo po referenci: to pomeni, da imata obe spremenljivki za vrednost isti objekt. To ima pomembno posledico: če spremenimo kakšne lastnosti objeka s pomočjo ene spremenljivke, se bodo v drugi spremenljivki pojavile te iste spremembe.

Poglejmo si to v praksi. Ustvarimo objekt z uporabnikom:

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

Priredimo objekt drugi spremenljivki:

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

Spremenimo lastnost name v spremenljivki $test

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

Preverimo, ali se je spremenil skupni objekt. Izpišimo lastnost name iz spremenljivke $user:

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

Naredite razred Product, v katerem so naslednje lastnosti: name, price.

Задание 2

Ustvarite objekt razreda Product, zapišite ga v spremenljivko $product1.

Задание 3

Priredite vrednost spremenljivke $product1 spremenljivki $product2. Preverite, da se obe spremenljivki sklicujeta na isti objekt.