Вопрос к знатокам 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 надеюсь суть моего вопроса понятна, подскажите пожалуйста не могу изучать дальше когда есть что то не понятное.
Адиль
15 марта 2016, 08:29
modx.pro
1 027
+1

Комментарии: 3

Сергей Фещуков
15 марта 2016, 16:23
0
$assigned   =  $instance;
Этот код клонирует объект $instance и записывает в переменную $assigned указатель на клонированный.
$reference  =& $instance;
&$instance — указатель на объект. Соответственно, класс не клонируется, а у объекта просто появляется второе имя. То есть теперь $instance и $reference — это одно и то же. И любые изменения в одной переменной ведут к изменениям в другой.
    Сергей Шлоков
    15 марта 2016, 22:59
    +1
    $assigned   =  $instance;
    Этот код клонирует объект $instance и записывает в переменную $assigned указатель на клонированный.
    Вообще не так. Подумай, зачем тогда нужна конструкция clone? И почему тогда, если это разные объекты, изменение $assigned изменяет $instance?

    На самом деле объект всегда один (начиная с PHP 5). Но в первом случае создается ещё один псевдоним объекта и получается, что две переменных ссылаются на один объект. Когда мы разрываем одну связь ($instance = null), вторая переменная ($assigned) всё ещё хранит ссылку на объект. Работая с двумя переменными, мы, на самом деле, работаем с одним объектом. Но удалить можно только связь с объектом. И когда удалится последняя связь, то удалится и сам объект. Похоже на жесткую ссылку в Linux.
    А во втором случае, переменная $reference — это прямая ссылка на объект в памяти. И в данном случае, присваивая переменной $reference NULL, обнуляется не связь, а сам объект, т.е. в память по адресу объекта записывается NULL.
    inogo
    15 марта 2016, 22:54
    0
    В документции PHP этот момент описан подробно.
    php.net/manual/ru/language.oop5.references.php

    В переменной $instance хранится лишь идентификатор объекта (экземпляра класса), когда Вы присвоили переменной $instance зачение null, то объект продолжил существовать в памяти. В переменной $assigned идентификатор сохранился, вывод var_dump($assigned) в этом случае корректный.
      Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
      3