Olioiden viittauksella välittäminen OOP:ssa PHP:ssä

Oletetaan, että meillä on seuraava luokka User:

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

Oletetaan, että luomme tämän luokan olion:

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

Kuvittele nyt seuraava tilanne: haluat muuttujan $user arvon sijoittaa jollekin toiselle muuttujalle, esimerkiksi $test.

Jos kyse ei olisi olioista, vaan primaattityypeistä, eli esimerkiksi merkkijonoista, luvuista, taulukoista jne., muuttujaan $test menisi kopio muuttujan $user arvosta.

Tämä tarkoittaa, että minkä tahansa muuttujan muuttaminen myöhemmin ei muuttaisi toisen muuttujan arvoa. Katsotaanpa esimerkkiä:

index.php<?php
  $user = 1;
  
  $test = $user; // muuttujassa $test on nyt 1
  $test = 2;     // muuttujassa $test on nyt 2, mutta $user:ssa edelleen 1
?>

Olioiden kanssa asiat ovat toisin - kun sijoitetaan toiseen muuttujaan, olioita ei kopioida, vaan ne siirretään viittauksella: tämä tarkoittaa, että molemmilla näillä muuttujilla on arvonaan yksi ja sama olio. Tällä on tärkeä seuraus: jos muutetaan joitain olion ominaisuuksia yhden muuttujan kautta, toisessa muuttujassa näkyvät samat muutokset.

Katsotaanpa käytännössä. Luodaan olio käyttäjästä:

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

Sijoitetaan olio toiseen muuttujaan:

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

Muutetaan ominaisuutta name muuttujassa $test

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

Tarkistetaan, että yhteinen olio on muuttunut. Tulostetaan ominaisuus name muuttujasta $user:

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

Tee luokka Product, jossa on seuraavat ominaisuudet: name, price.

Задание 2

Luo luokan Product olio, tallenna se muuttujaan $product1.

Задание 3

Sijoita muuttujan $product1 arvo muuttujaan $product2. Tarkista, että molemmat muuttujat viittaavat yhteen ja samaan olioon.