код взят из мануала. прокомментирую в самом коде свою проблему Код (Text): <?php class SimpleClass { public $var; } $instance = new SimpleClass(); // получили новый экземпляр класса $assigned = $instance; /* присвоили новой переменной уже существующий экземпляр класса (в таком случае переменная должна указывать на этот же экземпляр класса, т.е. на $instance */ $reference =& $instance; /* ссылаемся на $instance , т.е. при изменении любой из этих переменных изменения понесут обе */ $instance->var = '$assigned будет иметь это значение'; /* а ещё $reference, но мануал умолчал об этом, ниже вардамп */ var_dump ($reference); // object bla-bla... var_dump ($assigned); object bla-bla... echo "<br><br>"; $instance = null; // $instance и $reference становятся null **** А КАК ЖЕ $assigned? var_dump($instance); var_dump($reference); var_dump($assigned); ?> пояснение: мне не понятно, что происходит. почему если $assigned указывает (ссылается) на $instance, то в конце она не становится null, как другие? туплю на ровном месте, сори
$assigned содержит ссылку на объект $instance. у меня это то же самое получается. А в чем конкретно проблема?
ну, я понимаю пока что вот так: Код (Text): $a = 10; $b =& $a; echo' $b; // 10 $a = 17; echo $b; // 17 в данном случае $assigned ссылается на переменную-объект $instance, которой присвоили нулевое значение, но сама $assigned не изменилась, хотя, как я предполагаю, должна была измениться на null. как всегда: дьявол кроется в деталях - мне нужно понять детали.
вардамп для первого и второго получается одинаковый Код (Text): object(SimpleClass)#1 (1) { ["var"]=> NULL } object(SimpleClass)#1 (1) { ["var"]=> NULL }
я, видимо, неправильно изъясняюсь (моя вечная проблема). я считаю, что вардамп третьего ( $assigned) тоже должен быть равен "NULL", ведь он, как говорит мануал, указывает (ссылается) на $instance (объект), которому присвоили NULL. если одному присвоили NULL, то и другой должен стать таким же... Добавлено спустя 39 секунд: если опять непонятно написал, подметьте это - попробую лучше пояснить свой вопрос)
все ок. Никто не рождается всезнающим) Но опять таки, у меня все ок. Код (Text): <?php class SimpleClass { public $var; } $instance = new SimpleClass(); // получили новый экземпляр класса $assigned = $instance; $assigned->var = "тестовое значение"; echo "<pre>"; var_dump($instance); var_dump($assigned); echo "</pre>"; Код (Text): object(SimpleClass)#1 (1) { ["var"]=> string(33) "тестовое значение" } object(SimpleClass)#1 (1) { ["var"]=> string(33) "тестовое значение" } Добавлено спустя 13 минут 50 секунд: В PHP 4 копирование объекта выполнялость очень просто - достаточно было присвоить значение одной объектной переменной другой Код (Text): Class CopyMe{} $first = new CopeMe(); $second = $first; //В PHP 4 переменные $second and $first ссылаются на 2 разных обекта //Начиная с PHP 5 переменные $second and $first ссылаются на один объект В PHP 5 объекты всегда присваиваются и передаются по ссылке. Это означает, что если предыдущий пример запустить в PHP 5, переенные $first и $second будут содержать ссылки на один и тот же объект, а не на две его копии. если нужно получиь копию объекта, то используй clone
этим ты уничтожил ссылку на объект. $instance->var = null; - значения свойств менять только так. Добавлено спустя 3 минуты 20 секунд: Добавлено спустя 33 секунды: еще вот, почитай https://php.net/manual/ru/language.references
а-а. вроде бы осознал. буду распознавать так: $instance ссылается на класс SimpleClass и является эекземпляром данного класса. $assigned ссылается теперь тоже на класс SimpleClass. а $reference ссылается на $instance(ссылку на класс SimpleClass). Код (Text): $instance = new SimpleClass(); $assigned = $instance; $reference =& $instance; и тогда по коду происходит уничтожение ссылки на класс, на которую ссылается $reference. Добавлено спустя 2 минуты 16 секунд: спасибо, прочту. просто иду по мануалу, так сказать, по оглавлению, а ссылки там ещё не встречались в подробном виде.