Что это значит? Другими словами, ссылочное поведение массивов определяется поэтапным принципом: эталонное поведение отдельных элементов отделено от ссылочного статуса контейнера массива ».
Как отдельные элементы отделены от ссылочного статуса контейнера массива? Я собирался провести тщательный док, и я смущен, что это значит?
<?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] .