Пусть у нас дан вот такой класс User:
<?php
class User
{
public $name;
public $age;
public function __construct($name, $age)
{
$this->name = $name;
$this->age = $age;
}
}
?>
Пусть мы создаем объект этого класса:
<?php
$user = new User('Коля', 30);
?>
Представьте теперь следующую ситуацию: вы хотите значение переменной $user присвоить какой-нибудь другой переменной, например $test.
Если речь шла не об объектах, а о примитивах, то есть о строках, числах, массивах и тп, то в переменную $test попала бы копия значения переменной $user.
Что значит копия: это значит, что изменения любой из переменной в дальнейшем не меняли бы значение другой переменной.
Посмотрим на примере:
<?php
$user = 1;
$test = $user; // в переменной $test теперь 1
$test = 2; // в переменной $test теперь 2, а в $user - по-прежнему 1
?>
С объектами все по-другому - при записи в другую переменную объекты не копируются, а передаются по ссылке: это значит, что обе эти переменные значением имеют один и тот же объект.
Это имеет важное следствие: если поменять какие-то свойства объекта с помощью одной переменной, во второй переменной появятся эти же изменения:
<?php
$user = new User('Коля', 30);
$test = $user; // и $test, и $user ссылаются на один и тот же объект
$test->name = 'Вася'; // поменяли переменную $test - но $user также поменялась!
// Проверим - выведем свойство name из переменной $user:
echo $user->name; // выведет 'Вася'!
?>
Учтите, что речь идет именно об объектах. Если вы в какую-то переменную запишите данные из свойства объекта - они скопируются, а не передадутся по ссылке:
<?php
$user = new User('Коля', 30);
$name = $user->name; // запишем в переменную $name текст 'Коля'
$name = 'Вася'; // поменяли переменную $name, но $user->name не поменялось
// Проверим - выведем свойство name из переменной $user:
echo $user->name; // выведет 'Коля'
?>
<?php
$user = new User('Коля', 30);
$test = $user; // и $test, и $user ссылаются на один и тот же объект
$test = 123; // теперь $test не ссылается, а $user - ссылается
?>
Объект существует в памяти компьютера до тех пор, пока на него ссылается хоть кто-нибудь. В примере выше, если что-нибудь записать и в переменную $user - на наш объект больше не будет ссылаться ни одна переменная и этот объект удалится из памяти.
Сделайте класс Product (продукт), в котором будут следующие свойства: name (название продукта), price (цена).
Создайте объект класса Product, запишите его в переменную $product1.
Присвойте значение переменной $product1 в переменную $product2. Проверьте то, что обе переменные ссылаются на один и тот же объект.