Transmiterea obiectelor prin referință în OOP în PHP

Să presupunem că avem următoarea clasă User:

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

Să presupunem că creăm un obiect al acestei clase:

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

Imaginați-vă acum următoarea situație: doriți să atribuiți valoarea variabilei $user unei alte variabile, de exemplu $test.

Dacă nu am vorbi despre obiecte, ci despre primitive, adică șiruri de caractere, numere, matrice etc., atunci în variabila $test s-ar copia valoarea variabilei $user.

Aceasta înseamnă că modificările oricărei variabile ulterior nu ar schimba valoarea celeilalte variabile. Să vedem un exemplu:

index.php<?php
  $user = 1;
  
  $test = $user; // în variabila $test acum este 1
  $test = 2;     // în variabila $test acum este 2, iar în $user - încă 1
?>

Cu obiectele este diferit - atunci când sunt atribuite unei alte variabile, obiectele nu sunt copiate, ci sunt transmise prin referință: aceasta înseamnă că ambele variabile au ca valoare același obiect. Aceasta are o consecință importantă: dacă se modifică unele proprietăți ale obiectului cu ajutorul unei variabile, în a doua variabilă vor apărea aceleași modificări.

Să vedem în practică. Să creăm un obiect cu utilizatorul:

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

Să atribuim obiectul unei alte variabile:

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

Să modificăm proprietatea name în variabila $test

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

Să verificăm dacă obiectul comun s-a schimbat. Să afișăm proprietatea name din variabila $user:

index.php<?php
  echo $user->name; // va afișa 'eric'!
?>
Задание 1

Creați o clasă Product, în care vor fi următoarele proprietăți: name, price.

Задание 2

Creați un obiect al clasei Product, înscrieți îl în variabila $product1.

Задание 3

Atribuiți valoarea variabilei $product1 variabilei $product2. Verificați faptul că ambele variabile se referă la același obiect.