Předávání objektů odkazem v OOP v PHP

Předpokládejme, že máme danou tuto třídu User:

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

Předpokládejme, že vytváříme objekt této třídy:

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

Nyní si představte následující situaci: chcete hodnotu proměnné $user přiřadit nějaké jiné proměnné, například $test.

Pokud by se nejednalo o objekty, ale o primitivní typy, tj. o řetězce, čísla, pole atd., do proměnné $test by se dostala kopie hodnoty proměnné $user.

To znamená, že změny kterékoliv z proměnných dále by neměnily hodnotu druhé proměnné. Podívejme se na příklad:

index.php<?php
  $user = 1;
  
  $test = $user; // v proměnné $test je nyní 1
  $test = 2;     // v proměnné $test je nyní 2, ale v $user - stále 1
?>

S objekty je to jinak - při zápisu do jiné proměnné se objekty nekopírují, ale předávají odkazem: to znamená, že obě tyto proměnné mají za hodnotu jeden a tentýž objekt. To má důležitý důsledek: pokud změníme nějaké vlastnosti objektu pomocí jedné proměnné, ve druhé proměnné se objeví tytéž změny.

Podívejme se na to v praxi. Vytvořme objekt s uživatelem:

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

Přiřaďme objekt do jiné proměnné:

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

Změňme vlastnost name v proměnné $test

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

Ověřme, že se změnil společný objekt. Vypišme vlastnost name z proměnné $user:

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

Vytvořte třídu Product, ve které budou následující vlastnosti: name, price.

Задание 2

Vytvořte objekt třídy Product, zapište ho do proměnné $product1.

Задание 3

Přiřaďte hodnotu proměnné $product1 do proměnné $product2. Ověřte, že obě proměnné odkazují na jeden a tentýž objekt.