Передача объектов по ссылке в ООП в 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
. Проверьте
то, что обе переменные ссылаются на один
и тот же объект.