Семантика копирования массива PHP: что он делает, когда члены являются ссылками, и где это задокументировано? - PullRequest
2 голосов
/ 20 мая 2011

Этот код

<?php

$a = 10;
$arr1 = array(&$a);

$arr1[0] = 20;
echo $a; echo "\n";

$arr2 = $arr1;
$arr2[0] = 30;

echo $a;

производит

20
30

Очевидно, что элементы ссылочного массива "сохранены", что может привести, например, к некоторому интересному / странному поведению, например

<?php

function f($arr) {
    $arr[0] = 20;
}

$val = 10;
$a = array(&$val);

f($a);

echo $a[0];

?>

1010 * Вывод *

20

Мой вопрос: для чего он нужен, где он задокументирован (кроме комментария пользователя по адресу http://www.php.net/manual/en/language.types.array.php#50036) и самого исходного кода Zend Engine?

1 Ответ

3 голосов
/ 20 мая 2011

Назначение PHP по ссылочному поведению описано на странице справки «PHP: что делают ссылки» . Там вы также найдете абзац со ссылками на значения массива, начиная с:

Не являясь строго присваиванием по ссылке, выражения, созданные с помощью языковой конструкции array (), могут также вести себя как таковые, добавляя префикс & к элементу массива для добавления.

На странице также объясняется, почему ваш первый код ведет себя так:

Обратите внимание, однако, что ссылки внутри массивов потенциально опасны. Выполнение нормального (не по ссылке) назначения со ссылкой на правой стороне не превращает левую сторону в ссылку, но ссылки в массивах сохраняются в этих обычных назначениях. Это также относится к вызовам функций, когда массив передается по значению.

...