Przekazywanie obiektów przez referencję w OOP w PHP

Załóżmy, że mamy taką klasę User:

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

Załóżmy, że tworzymy obiekt tej klasy:

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

Wyobraźmy sobie teraz następującą sytuację: chcemy przypisać wartość zmiennej $user do innej zmiennej, na przykład $test.

Gdyby nie chodziło o obiekty, a o prymitywy, czyli o ciągi znaków, liczby, tablice itp., to do zmiennej $test trafiłaby kopia wartości zmiennej $user.

Oznacza to, że zmiany którejkolwiek ze zmiennych w przyszłości nie zmieniałyby wartości drugiej zmiennej. Spójrzmy na przykład:

index.php<?php
  $user = 1;
  
  $test = $user; // w zmiennej $test jest teraz 1
  $test = 2;     // w zmiennej $test jest teraz 2, a w $user - nadal 1
?>

Z obiektami jest inaczej - podczas zapisywania do innej zmiennej obiekty nie są kopiowane, a przekazywane przez referencję: oznacza to, że obie te zmienne mają jako wartość jeden i ten sam obiekt. Ma to ważną konsekwencję: jeśli zmienimy jakieś właściwości obiektu za pomocą jednej zmiennej, w drugiej zmiennej pojawią się te same zmiany.

Sprawdźmy to w praktyce. Stwórzmy obiekt z użytkownikiem:

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

Przypiszmy obiekt do innej zmiennej:

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

Zmieńmy właściwość name w zmiennej $test

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

Sprawdźmy, czy zmienił się wspólny obiekt. Wypiszmy właściwość name ze zmiennej $user:

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

Stwórz klasę Product, w której będą następujące właściwości: name, price.

Задание 2

Utwórz obiekt klasy Product, zapisz go w zmiennej $product1.

Задание 3

Przypisz wartość zmiennej $product1 do zmiennej $product2. Sprawdź, czy obie zmienne odwołują się do jednego i tego samego obiektu.