Передача объектов по ссылке
Пусть у нас дан вот такой класс 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);
$test = $user; // и $test, и $user ссылаются на один и тот же объект
$test->name = 'eric'; // поменяли переменную $test - но $user также поменялась!
// Проверим - выведем свойство name из переменной $user:
echo $user->name; // выведет 'eric'!
?>
Учтите, что речь идет именно об объектах. Если вы в какую-то переменную запишите данные из свойства объекта - они скопируются, а не передадутся по ссылке:
<?php
$user = new User('john', 30);
$name = $user->name; // запишем в переменную $name текст 'john'
$name = 'eric'; // поменяли переменную $name, но $user->name не поменялось
// Проверим - выведем свойство name из переменной $user:
echo $user->name; // выведет 'john'
?>
Если перезаписать переменную с объектом на примитив, то объект не исчезнет из другой переменной:
<?php
$user = new User('john', 30);
$test = $user; // и $test, и $user ссылаются на один и тот же объект
$user = 123; // теперь $test ссылается, а $user - нет
?>
Объект существует в памяти компьютера до
тех пор, пока на него ссылается хоть кто-нибудь.
В примере выше, если что-нибудь записать
и в переменную $user
- на наш объект
больше не будет ссылаться ни одна переменная
и этот объект удалится из памяти.
Сделайте класс Product
, в котором
будут следующие свойства: name
, price
.
Создайте объект класса Product
, запишите
его в переменную $product1
.
Присвойте значение переменной $product1
в переменную $product2
. Проверьте
то, что обе переменные ссылаются на один
и тот же объект.