Transmiterea obiectelor prin referință în OOP în PHP
Să presupunem că avem următoarea clasă User:
<?php
class User
{
public $name;
public $age;
public function __construct($name, $age)
{
$this->name = $name;
$this->age = $age;
}
}
?>
Să presupunem că creăm un obiect al acestei clase:
<?php
$user = new User('john', 30);
?>
Imaginați-vă acum următoarea situație: doriți
să atribuiți valoarea variabilei $user
unei alte variabile, de exemplu
$test.
Dacă nu am vorbi despre obiecte, ci despre primitive,
adică șiruri de caractere, numere, matrice etc.,
atunci în variabila $test s-ar copia
valoarea variabilei $user.
Aceasta înseamnă că modificările oricărei variabile ulterior nu ar schimba valoarea celeilalte variabile. Să vedem un exemplu:
<?php
$user = 1;
$test = $user; // în variabila $test acum este 1
$test = 2; // în variabila $test acum este 2, iar în $user - încă 1
?>
Cu obiectele este diferit - atunci când sunt atribuite unei alte variabile, obiectele nu sunt copiate, ci sunt transmise prin referință: aceasta înseamnă că ambele variabile au ca valoare același obiect. Aceasta are o consecință importantă: dacă se modifică unele proprietăți ale obiectului cu ajutorul unei variabile, în a doua variabilă vor apărea aceleași modificări.
Să vedem în practică. Să creăm un obiect cu utilizatorul:
<?php
$user = new User('john', 30);
?>
Să atribuim obiectul unei alte variabile:
<?php
$test = $user;
?>
Să modificăm proprietatea name
în variabila $test
<?php
$test->name = 'eric';
?>
Să verificăm dacă obiectul comun s-a schimbat.
Să afișăm proprietatea name
din variabila $user:
<?php
echo $user->name; // va afișa 'eric'!
?>
Creați o clasă Product, în care
vor fi următoarele proprietăți: name,
price.
Creați un obiect al clasei Product, înscrieți
îl în variabila $product1.
Atribuiți valoarea variabilei $product1
variabilei $product2. Verificați
faptul că ambele variabile se referă la același
obiect.