Цитата:
Сообщение от nikp
Вот еще интересная выдержка из манов.
Однако следует отметить, что ссылки в массивах являются потенциально опасными. При обычном (не по ссылке) присвоении массива, ссылки внутри этого массива сохраняются. Это также относится и к вызовам функций, когда массив передается по значению. Пример:
PHP код:
<?php /* Присвоение скалярных переменных */ $a = 1; $b =& $a; $c = $b; $c = 7; //$c не ссылка и не изменяет значений $a и $b
/* Присвоение массивов */ $arr = array(1); $a =& $arr[0]; //$a и $arr[0] ссылаются на одно значение $arr2 = $arr; //присвоение не по ссылке! $arr2[0]++; /* $a == 2, $arr == array(2) */ /* Содержимое $arr изменилось, хотя было присвоено не по ссылке! */ ?>
Иными словами, поведение отдельных элементов массива не зависит от типа присвоения этого массива.
|
Витиевато, но наталкивает на мысли.
Вот такой простой эксперимент показывает, что после того как мы получаем ссылку на элемент массива, сам этот элемент превращается в сырую ссылку.
PHP код:
$arr = array(1);
var_dump($arr);
$a = &$arr[0];
var_dump($arr);
unset($a);
var_dump($arr);
Размножая ссылки на элемент массива
PHP код:
$arr = array(1);
var_dump($arr);
$a = &$arr[0];
var_dump($arr);
$x=& $a;
unset($a);
var_dump($arr);
я начинаю догадываться, что механизм следующий: если мы создаем ссылку на объект, то этот объект переносится в другое место памяти, а по прежнему месту кладется ссылка. Вот еще немножко игры со ссылками:
PHP код:
$arr = array(1);
var_dump($arr);
$a = &$arr[0];
var_dump($arr);
$x=& $a;
unset($arr);
$b[0]=& $x;
var_dump($b);
$b[0]=123;
var_dump($a);
Так же возникает мысль, что оператор $ разыменовывает автоматом и мы не можем пощупать живой адрес.
Тогда всё становится прозрачно:
- присваивая через =$переменная мы автоматом разыменовываем, и получаем значение
- присваивая какую-либо сложную структуру целиком мы сохраняем все ссылки внутри свойств этой структуры
- создавая ссылку на объект, мы получаем вместо этого объекта ссылку! (в чем сложно убедиться, ибо $ разыменовывает автоматом, но пример на массивах выше показателен)
upd:
а вот эту потерю ссылку в массиве на переменную я объяснить не могу:
PHP код:
$z=22;
$x=44;
$a[0]=& $x;
var_dump($a);
$x=& $z;
// $x=$z; //то ссылку в массиве не теряем
$x=77;
var_dump($a);