Objektide edastamine viidete kaudu OOP-s PHP-s

Oletame, et meil on antud järgmine klass User:

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

Oletame, et loome selle klassi objekti:

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

Kujutage nüüd ette järgmist olukorda: te soovite muutuja $user väärtuse omistada mõnele teisele muutujale, näiteks $test.

Kui tegemist poleks objektidega, vaid primitiividest, st stringide, arvude, massiivide jms, siis muutujasse $test saaks muutuja $user väärtuse koopia.

See tähendab, et ühegi muutuja muutmine edaspidi ei muudaks teise muutuja väärtust. Vaatame näidet:

index.php<?php
  $user = 1;
  
  $test = $user; // muutujas $test on nüüd 1
  $test = 2;     // muutujas $test on nüüd 2, kuid $user-s on endiselt 1
?>

Objektidega on teisiti - teise muutuja omistamisel objekte ei kopeerita, vaid edastatakse viite kaudu: see tähendab, et mõlemal muutujal on väärtusena üks ja sama objekt. Sellel on oluline tagajärg: kui muuta mõnda objekti omadust ühe muutuja abil, siis teises muutujas ilmuvad need samad muutused.

Vaatame praktikas. Loome kasutajaga objekti:

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

Omistame objekti teise muutuja:

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

Muudame omadust name muutujas $test

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

Kontrollime, kas ühine objekt on muutunud. Väljastame omaduse name muutujast $user:

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

Tehke klass Product, milles on järgmised omadused: name, price.

Задание 2

Looge klassi Product objekt, kirjutage see muutujasse $product1.

Задание 3

Omistage muutuja $product1 väärtus muutujasse $product2. Kontrollige seda, et mõlemad muutujad viitavad ühele ja samale objektile.