Что это значит? Другими словами, ссылочное поведение массивов определяется поэтапным принципом: эталонное поведение отдельных элементов отделено от ссылочного статуса контейнера массива ».
Как отдельные элементы отделены от ссылочного статуса контейнера массива? Я собирался провести тщательный док, и я смущен, что это значит?
<?php /* Assignment of scalar variables */ $a = 1; $b =& $a; $c = $b; $c = 7; //$c is not a reference; no change to $a or $b /* Assignment of array variables */ $arr = array(1); $a =& $arr[0]; //$a and $arr[0] are in the same reference set $arr2 = $arr; //not an assignment-by-reference! $arr2[0]++; /* $a == 2, $arr == array(2) */ /* The contents of $arr are changed even though it's not a reference! */ ?>
Я думаю, что если вы используете какое-то искусство ASCII, вы можете это понять лучше:
//Line 01 $a = 1; ---------- ┌──────┐ ┌─────┐ │ $a │ ─────────────────> │ 1 │ └──────┘ └─────┘
//Line 02 $b = &$a; ---------- ┌──────┐ ┌─────┐ │ $a │ ─────────────────> │ 1 │ └──────┘ └─────┘ ^ ┌──────┐ │ │ $b │ ───────────────────────┘ └──────┘
//Line 03 $c = $b; ---------- ┌──────┐ ┌─────┐ │ $a │ ─────────────────> │ 1 │ └──────┘ └─────┘ ^ ┌──────┐ │ │ $b │ ───────────────────────┘ └──────┘ ┌──────┐ ┌─────┐ │ $c │ ─────────────────> │ 1 │ └──────┘ └─────┘
//Line 04 $c = 7; ---------- ┌──────┐ ┌─────┐ │ $a │ ─────────────────> │ 1 │ └──────┘ └─────┘ ^ ┌──────┐ │ │ $b │ ───────────────────────┘ └──────┘ ┌──────┐ ┌─────┐ │ $c │ ─────────────────> │ 7 │ └──────┘ └─────┘
Теперь, как вы можете видеть, когда вы назначаете переменную по ссылке и вы ее изменяете, она также изменит значение для другой переменной. Здесь, например, $a
и $b
, если вы назначаете от 5 до $b
, $a
также укажет на 5, наоборот.
Но вы не назначили $b
для $c
по ссылке (вы сделали нормальное присвоение значения), поэтому, если вы измените значение $c
оно не изменит значение $b
(, или $a
).
//Line 01 $arr = array(1); ---------- ┌───────────┐ ┌─────┐ │ $arr[0] │ ─────────────────> │ 1 │ └───────────┘ └─────┘
//Line 02 $a = &$arr[0]; ---------- ┌───────────┐ ┌─────┐ │ $arr[0] │ ─────────────────> │ 1 │ └───────────┘ └─────┘ ^ ┌──────┐ │ │ $a │ ────────────────────────────┘ └──────┘
// Линия 03 $ arr2 = $ arr; ---------- ┌────────────────────────────────────────┐ │ $ arr [0] │ ──────────────────────────────────────────│ └────────────────────────────────────────┘ ^ ┌──────┐ │ │ $ a │ ────────────────────────────────────────────────────────────────┤ └──────┘ │ │ ┌────────────┐ │ │ $ arr2 [0] │ ─────────────────────────────────────────────────────┘ └────────────┘
//Line 04 $arr2[0]++; ---------- ┌───────────┐ ┌─────┐ │ $arr[0] │ ─────────────────> │ 2 │ └───────────┘ └─────┘ ^ ┌──────┐ │ │ $a │ ────────────────────────────┤ └──────┘ │ │ ┌────────────┐ │ │ $arr2[0] │ ──────────────────────┘ └────────────┘
Теперь идет строка, которую руководство пытается объяснить:
$arr2 = $arr;
Даже если вы не присваиваете массив $arr
ссылкой на $arr2
, массив все еще содержит элемент, который указывает на ссылку! И эта ссылка все равно будет в $arr2
, поэтому первый элемент второго массива также указывает на ссылку как $arr[0]
и $a
.
Возможно, если вы видите разницу, когда массив присваивается ссылкой, и когда массив содержит элемент со ссылкой, вы понимаете это лучше:
//Line 01 $arr1 = [1, 1, 1]; ---------- ┌─────────┐ │ $arr1 │ └─────────┘ │ │ └─────────> ┌────────────┐ │ Array │ ┌─────┐ │ container: │ ┌───> │ 1 │ ├────────────┤ │ └─────┘ │ [0] │ ───┘ ├────────────┤ ┌─────┐ │ [1] │ ───────> │ 1 │ ├────────────┤ └─────┘ │ [2] │ ───┐ └────────────┘ │ ┌─────┐ └───> │ 1 │ └─────┘
// Строка 02 $ arr2 = & $ arr1; ---------- ┌─────────┐ │ $ arr1 │ └─────────┘ │ │ └────────────────────────────────────────────────┐ │ Массив │ ┌──────┐ │ контейнер: │ ┌───> │ 1 │ -> │ [0] │ ───┘ ├───────────────────────────────────────────┐ │ [1] │ ────────> │ 1 │ ├───────────────────────────────────────────┘ │ [2] │ ───┐ ┌─────────────────────────────────────────────────────────────────────┐ ┌ │ └───> │ 1 │ │ └──────┘ ┌─────────┐ │ $ arr2 │ └─────────┘
//Line 03 & 04 $arr2[0] = 2; $arr2[1] = 2; ---------- ┌─────────┐ │ $arr1 │ └─────────┘ │ │ └─────────> ┌────────────┐ │ Array │ ┌─────┐ │ container: │ ┌───> │ 2 │ ├────────────┤ │ └─────┘ │ [0] │ ───┘ ├────────────┤ ┌─────┐ │ [1] │ ───────> │ 2 │ ├────────────┤ └─────┘ │ [2] │ ───┐ ┌─────────> └────────────┘ │ ┌─────┐ │ └───> │ 1 │ │ └─────┘ ┌─────────┐ │ $arr2 │ └─────────┘
Итак, как вы можете видеть здесь, поскольку вы назначили $arr1
на $arr2
по ссылке, они оба указывают на тот же массив.
//Line 01 $a = 1; ---------- ┌──────┐ ┌─────┐ │ $a │ ─────────────────> │ 1 │ └──────┘ └─────┘
// Строка 02 $ arr3 = [ & $ a , 1, 1]; ---------- ┌──────┐ ┌──────┐ │ $ a │ ───────────────────────────────────────────────────│ └──────┘ └──────┘ ^ ┌─────────┐ │ │ $ arr3 │ │ └─────────┘ │ │ │ │ │ └─────────────────────────────────────> │ Массив │ │ │ контейнер: │ │ ├────────────┤ │ │ [0] │ ───┘ ├───────────────────────────────────────────┐ │ [1] │ ────────> │ 1 │ ├───────────────────────────────────────────┘ │ [2] │ ───┐ -> └───> │ 1 │ └─────┘
// Линия 03 $ arr4 = $ arr3; ---------- ┌──────┐ ┌──────┐ │ $ a │ ─────────────────────────────────────────────────> │ 1 │ └──────┘ └─────┘ │ ^ │ ┌──────────┐ │ │ │ $ arr3 │ │ │ └──────────┘ │ │ │ │ │ │ │ │ └──────────────────────────────────────────────────────────> │ Массив │ │ │ │ контейнер: │ │ │ ├──────────────┤ │ │ │ [0] │ ───┘ │ ├───────────────────────────────────────────────│ │ [1] │ ───────> │ 1 │ │ ├───────────────────────────────────────────────│ │ [2] │ ───┐ │ └───────────┘ │ ┌────── └───> │ 1 │ │ └─────┘ │ │ ┌─────────┐ │ │ $ arr4 │ │ └─────────┘ │ │ │ │ │ └─────────────────────────────────────> │ Массив │ │ │ контейнер: │ │ ├────────────┤ │ │ [0] │ ───────────────────────────────────────────┘ ├───────────────────────────────────────────┐ │ [1] │ ────────> │ 1 │ ├───────────────────────────────────────────┘ │ [2] │ ───┐ -> └───> │ 1 │ └─────┘
//Line 03 & 04 $arr4[0] = 2; $arr4[1] = 2; ---------- ┌──────┐ ┌─────┐ │ $a │ ──────────────────> │ 2 │ <─────────┐ └──────┘ └─────┘ │ ^ │ ┌─────────┐ │ │ │ $arr3 │ │ │ └─────────┘ │ │ │ │ │ │ │ │ └─────────> ┌────────────┐ │ │ │ Array │ │ │ │ container: │ │ │ ├────────────┤ │ │ │ [0] │ ───┘ │ ├────────────┤ ┌─────┐ │ │ [1] │ ───────> │ 1 │ │ ├────────────┤ └─────┘ │ │ [2] │ ───┐ │ └────────────┘ │ ┌─────┐ │ └───> │ 1 │ │ └─────┘ │ │ ┌─────────┐ │ │ $arr4 │ │ └─────────┘ │ │ │ │ │ └─────────> ┌────────────┐ │ │ Array │ │ │ container: │ │ ├────────────┤ │ │ [0] │ ──────────────────┘ ├────────────┤ ┌─────┐ │ [1] │ ───────> │ 2 │ ├────────────┤ └─────┘ │ [2] │ ───┐ └────────────┘ │ ┌─────┐ └───> │ 1 │ └─────┘
Таким образом, вы можете видеть здесь, даже если вы назначили $arr3
до $arr4
по стоимости, а не по ссылке! Массив все еще содержит эту ссылку, которая делится с $a
и $arr3[0]
.