Preklad objektov odkazom v OOP v PHP

Nech je nám daná takáto trieda User:

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

Nech vytvárame objekt tejto triedy:

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

Predstavte si teraz nasledujúcu situáciu: vy chcete hodnotu premennej $user priradiť nejakej inej premennej, napríklad $test.

Ak by sa nejednalo o objekty, ale o primitívne typy, teda o reťazce, čísla, polia atď., potom by do premennej $test prišla kópia hodnoty premennej $user.

To znamená, že zmeny akejkoľvek premennej by v budúcnosti nemenili hodnotu druhej premennej. Pozrime sa na príklad:

index.php<?php
  $user = 1;
  
  $test = $user; // v premennej $test je teraz 1
  $test = 2;     // v premennej $test je teraz 2, ale v $user - stále 1
?>

S objektami je to inak - pri zápise do iných premenných sa objekty nekopírujú, ale prenášajú sa odkazom: to znamená, že obe tieto premenné majú hodnotou jeden a ten istý objekt. Má to dôležitý dôsledok: ak sa zmenia nejaké vlastnosti objektu pomocou jednej premennej, v druhej premennej sa objavia tie isté zmeny.

Pozrime sa na to v praxi. Vytvorme objekt s používateľom:

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

Priraďme objekt do inej premennej:

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

Zmeňme vlastnosť name v premennej $test

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

Skontrolujme, či sa zmenil spoločný objekt. Vypíšme vlastnosť name z premennej $user:

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

Vytvorte triedu Product, v ktorej budú nasledujúce vlastnosti: name, price.

Задание 2

Vytvorte objekt triedy Product, zapíšte ho do premennej $product1.

Задание 3

Priraďte hodnotu premennej $product1 do premennej $product2. Skontrolujte, že obe premenné odkazujú na jeden a ten istý objekt.