Prosleđivanje objekata po referenci u OOP u PHP-u
Neka nam je dat ovakav klasa User:
<?php
class User
{
public $name;
public $age;
public function __construct($name, $age)
{
$this->name = $name;
$this->age = $age;
}
}
?>
Neka kreiramo objekat ove klase:
<?php
$user = new User('john', 30);
?>
Zamislite sada sledeću situaciju: želite
vrednost promenljive $user da dodelite
nekoj drugoj promenljivoj, na primer
$test.
Da nije reč o objektima, već o primitivima,
odnosno o stringovima, brojevima, nizovima i sl.,
onda bi u promenljivu $test otišla kopija
vrednosti promenljive $user.
To znači da promene bilo koje od promenljivih ubuduće ne bi menjale vrednost druge promenljive. Pogledajmo na primeru:
<?php
$user = 1;
$test = $user; // u promenljivoj $test sada je 1
$test = 2; // u promenljivoj $test sada je 2, a u $user - i dalje 1
?>
Kod objekata je drugačije - pri upisu u drugu promenljivu objekti se ne kopiraju, već se prosleđuju po referenci: to znači, da obe ove promenljive imaju za vrednost jedan te isti objekat. Ovo ima važnu posledicu: ako se promene neka svojstva objekta pomoću jedne promenljive, u drugoj promenljivoj pojaviće se te iste promene.
Pogledajmo u praksi. Kreirajmo objekat sa korisnikom:
<?php
$user = new User('john', 30);
?>
Dodelimo objekat drugoj promenljivoj:
<?php
$test = $user;
?>
Promenimo svojstvo name
u promenljivoj $test
<?php
$test->name = 'eric';
?>
Proverimo da li se promenio zajednički objekat.
Ispišimo svojstvo name
iz promenljive $user:
<?php
echo $user->name; // ispisaće 'eric'!
?>
Napravite klasu Product, u kojoj
će biti sledeća svojstva: name,
price.
Kreirajte objekat klase Product, zapišite
ga u promenljivu $product1.
Dodelite vrednost promenljive $product1
u promenljivu $product2. Proverite
da li obe promenljive referenciraju na jedan
te isti objekat.