Objektų perdavimas nuoroda OOP PHP

Tarkime, kad turime šią User klasę:

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

Tarkime, sukuriame šios klasės objektą:

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

Dabar įsivaizduokite tokią situaciją: norite priskirti kintamojo $user reikšmę kitam kintamajam, pavyzdžiui $test.

Jei kalbėtume ne apie objektus, o apie primitivus, tai yra apie eilutes, skaičius, masyvus ir pan., tada į kintamąjį $test patektų kintamojo $user reikšmės kopija.

Tai reiškia, kad vėlesni bet kurio kintamojo pakeitimai nekeistų kito kintamojo reikšmės. Pažiūrėkime pavyzdį:

index.php<?php
  $user = 1;
  
  $test = $user; // kintamajame $test dabar yra 1
  $test = 2;     // kintamajame $test dabar yra 2, o $user - vis tiek 1
?>

Su objektais viskas kitaip - priskiriant kitam kintamajam objektai nekopijuojami, o perduodami nuoroda: tai reiškia, kad abu šie kintamieji turi tą patį objektą kaip reikšmę. Tai turi svarbią pasekmę: jei keičiamos kokios nors objekto savybės naudojant vieną kintamąjį, antrajame kintamajame atsiras tie patys pakeitimai.

Pažiūrėkime praktiškai. Sukurkime vartotojo objektą:

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

Priskirkime objektą kitam kintamajam:

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

Pakeiskime savybę name kintamajame $test

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

Patikrinkime, ar pasikeitė bendras objektas. Išveskime savybę name iš kintamojo $user:

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

Sukurkite klasę Product, kurioje bus šios savybės: name, price.

Задание 2

Sukurkite Product klasės objektą, įrašykite jį į kintamąjį $product1.

Задание 3

Priskirkite kintamojo $product1 reikšmę kintamajam $product2. Patikrinkite, kad abu kintamieji nurodo tą patį objektą.