Przekazywanie obiektów przez referencję w OOP w PHP
Załóżmy, że mamy taką klasę User:
<?php
class User
{
public $name;
public $age;
public function __construct($name, $age)
{
$this->name = $name;
$this->age = $age;
}
}
?>
Załóżmy, że tworzymy obiekt tej klasy:
<?php
$user = new User('john', 30);
?>
Wyobraźmy sobie teraz następującą sytuację: chcemy
przypisać wartość zmiennej $user
do innej zmiennej, na przykład
$test.
Gdyby nie chodziło o obiekty, a o prymitywy,
czyli o ciągi znaków, liczby, tablice itp.,
to do zmiennej $test trafiłaby kopia
wartości zmiennej $user.
Oznacza to, że zmiany którejkolwiek ze zmiennych w przyszłości nie zmieniałyby wartości drugiej zmiennej. Spójrzmy na przykład:
<?php
$user = 1;
$test = $user; // w zmiennej $test jest teraz 1
$test = 2; // w zmiennej $test jest teraz 2, a w $user - nadal 1
?>
Z obiektami jest inaczej - podczas zapisywania do innej zmiennej obiekty nie są kopiowane, a przekazywane przez referencję: oznacza to, że obie te zmienne mają jako wartość jeden i ten sam obiekt. Ma to ważną konsekwencję: jeśli zmienimy jakieś właściwości obiektu za pomocą jednej zmiennej, w drugiej zmiennej pojawią się te same zmiany.
Sprawdźmy to w praktyce. Stwórzmy obiekt z użytkownikiem:
<?php
$user = new User('john', 30);
?>
Przypiszmy obiekt do innej zmiennej:
<?php
$test = $user;
?>
Zmieńmy właściwość name
w zmiennej $test
<?php
$test->name = 'eric';
?>
Sprawdźmy, czy zmienił się wspólny obiekt.
Wypiszmy właściwość name
ze zmiennej $user:
<?php
echo $user->name; // wypisze 'eric'!
?>
Stwórz klasę Product, w której
będą następujące właściwości: name,
price.
Utwórz obiekt klasy Product, zapisz
go w zmiennej $product1.
Przypisz wartość zmiennej $product1
do zmiennej $product2. Sprawdź,
czy obie zmienne odwołują się do jednego
i tego samego obiektu.