$array1=array(1,2);
$x=&$array1[1];
$array2=$array1;
$array2[1]=22;
print_r($array1);
выход:
Array
(
[0] => 1
[1] => 22
)
$array2
просто скопировал значение из $array1
на новый адрес, это не ссылка на $array1
так меняется $array2[1]
не должен меняться $array1
, если я удалю 2-ю строку где $x
Ссылаться на $array1[1]
тогда он ведет себя нормально.
$array2[1]
а также $x
не ссылаться на один и тот же адрес. так как $x
производя $array2[1]
?
согласно документу php.net:
однако ссылки внутри массивов потенциально опасны. Выполнение нормального (не по ссылке) назначения со ссылкой на правой стороне не превращает левую сторону в ссылку, но ссылки в массивах сохраняются в этих обычных назначениях. Это также относится к вызовам функций, когда массив передается по значению
Другими словами, эталонное поведение массивов определяется поэлементно; эталонное поведение отдельных элементов отделено от эталонного статуса контейнера массива.
см. этот документ php.net:
Выполнение нормального (не по ссылке) назначения со ссылкой на правой стороне не превращает левую сторону в ссылку, но ссылки в массивах сохраняются в этих обычных назначениях.
Смотрите ссылку:
$array1=array(1,2);
После этой строки zval 2-го элемента в $ array1 выглядит так: (is_ref => 0, refcount => 1, …)
$x=&$array1[1];
Эта строка устанавливает поле is_ref в zval в 1 (true) и пересчитывает в 2 (1 + 1)
$array2=$array1;
Эта строка устанавливает refcount в zval в 3 (2 + 1), is_ref по-прежнему 1 (true)
$array2[1]=22;
В этой строке интерпретатор увидел is_ref = 1 и подумал, что там только Рекомендации на этом zval (и не делайте копирование при записи).