Olioiden viittauksella välittäminen OOP:ssa PHP:ssä
Oletetaan, että meillä on seuraava luokka User:
<?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:
<?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ä:
<?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ä:
<?php
$user = new User('john', 30);
?>
Sijoitetaan olio toiseen muuttujaan:
<?php
$test = $user;
?>
Muutetaan ominaisuutta name
muuttujassa $test
<?php
$test->name = 'eric';
?>
Tarkistetaan, että yhteinen olio on muuttunut.
Tulostetaan ominaisuus name
muuttujasta $user:
<?php
echo $user->name; // tulostaa 'eric'!
?>
Tee luokka Product, jossa
on seuraavat ominaisuudet: name,
price.
Luo luokan Product olio, tallenna
se muuttujaan $product1.
Sijoita muuttujan $product1 arvo
muuttujaan $product2. Tarkista,
että molemmat muuttujat viittaavat yhteen
ja samaan olioon.