Posredovanje objektov po referenci v OOP v PHP
Recimo, da imamo podan razred User:
<?php
class User
{
public $name;
public $age;
public function __construct($name, $age)
{
$this->name = $name;
$this->age = $age;
}
}
?>
Recimo, da ustvarimo objekt tega razreda:
<?php
$user = new User('john', 30);
?>
Zdaj pa si predstavljajte naslednjo situacijo: želite
vrednost spremenljivke $user prirediti
kakšni drugi spremenljivki, na primer
$test.
Če ne bi šlo za objekte, ampak za primitivne tipe,
to je nize, števila, tabele itd.,
bi v spremenljivko $test šla kopija
vrednosti spremenljivke $user.
To pomeni, da spremembe katere koli spremenljivke v nadaljevanju ne bi spremenile vrednosti druge spremenljivke. Poglejmo si primer:
<?php
$user = 1;
$test = $user; // v spremenljivki $test je zdaj 1
$test = 2; // v spremenljivki $test je zdaj 2, v $user pa še vedno 1
?>
Z objekti je drugače - pri zapisovanju v drugo spremenljivko se objekti ne kopirajo, ampak se posredujejo po referenci: to pomeni, da imata obe spremenljivki za vrednost isti objekt. To ima pomembno posledico: če spremenimo kakšne lastnosti objeka s pomočjo ene spremenljivke, se bodo v drugi spremenljivki pojavile te iste spremembe.
Poglejmo si to v praksi. Ustvarimo objekt z uporabnikom:
<?php
$user = new User('john', 30);
?>
Priredimo objekt drugi spremenljivki:
<?php
$test = $user;
?>
Spremenimo lastnost name
v spremenljivki $test
<?php
$test->name = 'eric';
?>
Preverimo, ali se je spremenil skupni objekt.
Izpišimo lastnost name
iz spremenljivke $user:
<?php
echo $user->name; // izpiše 'eric'!
?>
Naredite razred Product, v katerem
so naslednje lastnosti: name,
price.
Ustvarite objekt razreda Product, zapišite
ga v spremenljivko $product1.
Priredite vrednost spremenljivke $product1
spremenljivki $product2. Preverite,
da se obe spremenljivki sklicujeta na isti
objekt.