Предаване на обекти по референция в ООП в PHP
Нека имаме даден следният клас User:
<?php
class User
{
public $name;
public $age;
public function __construct($name, $age)
{
$this->name = $name;
$this->age = $age;
}
}
?>
Нека създадем обект от този клас:
<?php
$user = new User('john', 30);
?>
Сега си представете следната ситуация: вие
искате да присвоите стойността на променливата $user
на някоя друга променлива, например
$test.
Ако ставаше дума не за обекти, а за примитиви,
тоест за низове, числа, масиви и т.н.,
тогава в променливата $test щеше да още копие
на стойността на променливата $user.
Това означава, че промените в която и да е от променливите в последствие няма да променят стойността на другата променлива. Нека погледнем пример:
<?php
$user = 1;
$test = $user; // в променливата $test сега е 1
$test = 2; // в променливата $test сега е 2, а в $user - все още 1
?>
С обектите е различно - при записване в друга променлива обектите не се копират, а се предават по референция: това означава, че и двете променливи имат за стойност един и същи обект. Това има важно следствие: ако се променят някакви свойства на обекта с помощта на едната променлива, във втората променлива ще се появят същите промени.
Нека видим на практика. Създайте обект с потребител:
<?php
$user = new User('john', 30);
?>
Присвоете обекта на друга променлива:
<?php
$test = $user;
?>
Променете свойството name
в променливата $test
<?php
$test->name = 'eric';
?>
Нека проверим дали общият обект се е променил.
Изведете свойството name
от променливата $user:
<?php
echo $user->name; // ще изведе 'eric'!
?>
Създайте клас Product, в който
да има следните свойства: name,
price.
Създайте обект от класа Product, запишете
го в променливата $product1.
Присвоете стойността на променливата $product1
на променливата $product2. Проверете
това, че и двете променливи сочат към един
и същи обект.