Вопрос к знатокам PHP
Уважаемые форумчане, долгое время вы были лишены моих вопросов, заходил сюда, но не писал, была своя суета. Вопрос такой, возник в результате прочтения мной документации по php. Вот сам вопрос в Документации по php сказано secure.php.net/manual/ru/language.oop5.basic.php что цитирую Когда происходит присвоение уже существующего экземпляра класса новой переменной, то эта переменная будет указывать на этот же экземпляр класса. Тоже самое происходит и при передаче экземпляра класса в функцию. Копию уже созданного объекта можно создать через ее клонирование. и приводится такой пример
<?php
$instance = new SimpleClass();
$assigned = $instance;
$reference =& $instance;
$instance->var = '$assigned будет иметь это значение';
$instance = null; // $instance и $reference становятся null
var_dump($instance);
var_dump($reference);
var_dump($assigned);
?>
у данного кода вот такой вывод NULL
NULL
object(SimpleClass)#1 (1) {
["var"]=>
string(30) "$assigned будет иметь это значение"
}
теперь вопрос почему при var_dump($assigned); выводится object(SimpleClass)#1 (1) {
["var"]=>
string(30) "$assigned будет иметь это значение"
}
а не NULL ведь var_dump($instance);
var_dump($reference);
возвращает NULL надеюсь суть моего вопроса понятна, подскажите пожалуйста не могу изучать дальше когда есть что то не понятное. Комментарии: 3
$assigned = $instance;
Этот код клонирует объект $instance и записывает в переменную $assigned указатель на клонированный.$reference =& $instance;
&$instance — указатель на объект. Соответственно, класс не клонируется, а у объекта просто появляется второе имя. То есть теперь $instance и $reference — это одно и то же. И любые изменения в одной переменной ведут к изменениям в другой. Вообще не так. Подумай, зачем тогда нужна конструкция clone? И почему тогда, если это разные объекты, изменение $assigned изменяет $instance?Этот код клонирует объект $instance и записывает в переменную $assigned указатель на клонированный.$assigned = $instance;
На самом деле объект всегда один (начиная с PHP 5). Но в первом случае создается ещё один псевдоним объекта и получается, что две переменных ссылаются на один объект. Когда мы разрываем одну связь ($instance = null), вторая переменная ($assigned) всё ещё хранит ссылку на объект. Работая с двумя переменными, мы, на самом деле, работаем с одним объектом. Но удалить можно только связь с объектом. И когда удалится последняя связь, то удалится и сам объект. Похоже на жесткую ссылку в Linux.
А во втором случае, переменная $reference — это прямая ссылка на объект в памяти. И в данном случае, присваивая переменной $reference NULL, обнуляется не связь, а сам объект, т.е. в память по адресу объекта записывается NULL.
В документции PHP этот момент описан подробно.
php.net/manual/ru/language.oop5.references.php
В переменной $instance хранится лишь идентификатор объекта (экземпляра класса), когда Вы присвоили переменной $instance зачение null, то объект продолжил существовать в памяти. В переменной $assigned идентификатор сохранился, вывод var_dump($assigned) в этом случае корректный.
php.net/manual/ru/language.oop5.references.php
В переменной $instance хранится лишь идентификатор объекта (экземпляра класса), когда Вы присвоили переменной $instance зачение null, то объект продолжил существовать в памяти. В переменной $assigned идентификатор сохранился, вывод var_dump($assigned) в этом случае корректный.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.