单个元素的引用行为与数组容器的引用状态分离?
The reference behavior of individual elements is dissociated from the reference status of the array container?
这是什么意思"In other words, the reference behavior of arrays is defined in an element-by-element basis; the reference behavior of individual elements is dissociated from the reference status of the array container."
单个元素如何与数组容器的引用状态分离?我正在彻底 doc 但我很困惑这是什么意思?
<?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 │ ────────────────────────────┘
└──────┘
//Line 03
$arr2 = $arr;
----------
┌───────────┐ ┌─────┐
│ $arr[0] │ ─────────────────> │ 1 │
└───────────┘ └─────┘
^
┌──────┐ │
│ $a │ ────────────────────────────┤
└──────┘ │
│
┌────────────┐ │
│ $arr2[0] │ ──────────────────────┘
└────────────┘
//Line 04
$arr2[0]++;
----------
┌───────────┐ ┌─────┐
│ $arr[0] │ ─────────────────> │ 2 │
└───────────┘ └─────┘
^
┌──────┐ │
│ $a │ ────────────────────────────┤
└──────┘ │
│
┌────────────┐ │
│ $arr2[0] │ ──────────────────────┘
└────────────┘
现在是手册试图解释的行:
$arr2 = $arr;
即使您没有通过引用 $arr2
来分配数组 $arr
,数组仍然包含一个指向引用的元素!该引用仍将在 $arr2
中,因此第二个数组的第一个元素也指向引用,如 $arr[0]
和 $a
那样。
如果您看到通过引用分配数组和数组保存带有引用的元素时的区别,您可能会更好地理解它:
通过引用分配的数组:
//Line 01
$arr1 = [1, 1, 1];
----------
┌─────────┐
│ $arr1 │
└─────────┘
│
│
└─────────> ┌────────────┐
│ Array │ ┌─────┐
│ container: │ ┌───> │ 1 │
├────────────┤ │ └─────┘
│ [0] │ ───┘
├────────────┤ ┌─────┐
│ [1] │ ───────> │ 1 │
├────────────┤ └─────┘
│ [2] │ ───┐
└────────────┘ │ ┌─────┐
└───> │ 1 │
└─────┘
//Line 02
$arr2 = &$arr1;
----------
┌─────────┐
│ $arr1 │
└─────────┘
│
│
└─────────> ┌────────────┐
│ Array │ ┌─────┐
│ container: │ ┌───> │ 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 │
└──────┘ └─────┘
//Line 02
$arr3 = [&$a, 1, 1];
----------
┌──────┐ ┌─────┐
│ $a │ ──────────────────> │ 1 │
└──────┘ └─────┘
^
┌─────────┐ │
│ $arr3 │ │
└─────────┘ │
│ │
│ │
└─────────> ┌────────────┐ │
│ Array │ │
│ container: │ │
├────────────┤ │
│ [0] │ ───┘
├────────────┤ ┌─────┐
│ [1] │ ───────> │ 1 │
├────────────┤ └─────┘
│ [2] │ ───┐
└────────────┘ │ ┌─────┐
└───> │ 1 │
└─────┘
//Line 03
$arr4 = $arr3;
----------
┌──────┐ ┌─────┐
│ $a │ ──────────────────> │ 1 │ <─────────┐
└──────┘ └─────┘ │
^ │
┌─────────┐ │ │
│ $arr3 │ │ │
└─────────┘ │ │
│ │ │
│ │ │
└─────────> ┌────────────┐ │ │
│ Array │ │ │
│ container: │ │ │
├────────────┤ │ │
│ [0] │ ───┘ │
├────────────┤ ┌─────┐ │
│ [1] │ ───────> │ 1 │ │
├────────────┤ └─────┘ │
│ [2] │ ───┐ │
└────────────┘ │ ┌─────┐ │
└───> │ 1 │ │
└─────┘ │
│
┌─────────┐ │
│ $arr4 │ │
└─────────┘ │
│ │
│ │
└─────────> ┌────────────┐ │
│ Array │ │
│ container: │ │
├────────────┤ │
│ [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]
.
共享
这是什么意思"In other words, the reference behavior of arrays is defined in an element-by-element basis; the reference behavior of individual elements is dissociated from the reference status of the array container."
单个元素如何与数组容器的引用状态分离?我正在彻底 doc 但我很困惑这是什么意思?
<?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 │ ────────────────────────────┘
└──────┘
//Line 03 $arr2 = $arr; ---------- ┌───────────┐ ┌─────┐ │ $arr[0] │ ─────────────────> │ 1 │ └───────────┘ └─────┘ ^ ┌──────┐ │ │ $a │ ────────────────────────────┤ └──────┘ │ │ ┌────────────┐ │ │ $arr2[0] │ ──────────────────────┘ └────────────┘
//Line 04
$arr2[0]++;
----------
┌───────────┐ ┌─────┐
│ $arr[0] │ ─────────────────> │ 2 │
└───────────┘ └─────┘
^
┌──────┐ │
│ $a │ ────────────────────────────┤
└──────┘ │
│
┌────────────┐ │
│ $arr2[0] │ ──────────────────────┘
└────────────┘
现在是手册试图解释的行:
$arr2 = $arr;
即使您没有通过引用 $arr2
来分配数组 $arr
,数组仍然包含一个指向引用的元素!该引用仍将在 $arr2
中,因此第二个数组的第一个元素也指向引用,如 $arr[0]
和 $a
那样。
如果您看到通过引用分配数组和数组保存带有引用的元素时的区别,您可能会更好地理解它:
通过引用分配的数组:
//Line 01
$arr1 = [1, 1, 1];
----------
┌─────────┐
│ $arr1 │
└─────────┘
│
│
└─────────> ┌────────────┐
│ Array │ ┌─────┐
│ container: │ ┌───> │ 1 │
├────────────┤ │ └─────┘
│ [0] │ ───┘
├────────────┤ ┌─────┐
│ [1] │ ───────> │ 1 │
├────────────┤ └─────┘
│ [2] │ ───┐
└────────────┘ │ ┌─────┐
└───> │ 1 │
└─────┘
//Line 02 $arr2 = &$arr1; ---------- ┌─────────┐ │ $arr1 │ └─────────┘ │ │ └─────────> ┌────────────┐ │ Array │ ┌─────┐ │ container: │ ┌───> │ 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 │
└──────┘ └─────┘
//Line 02 $arr3 = [&$a, 1, 1]; ---------- ┌──────┐ ┌─────┐ │ $a │ ──────────────────> │ 1 │ └──────┘ └─────┘ ^ ┌─────────┐ │ │ $arr3 │ │ └─────────┘ │ │ │ │ │ └─────────> ┌────────────┐ │ │ Array │ │ │ container: │ │ ├────────────┤ │ │ [0] │ ───┘ ├────────────┤ ┌─────┐ │ [1] │ ───────> │ 1 │ ├────────────┤ └─────┘ │ [2] │ ───┐ └────────────┘ │ ┌─────┐ └───> │ 1 │ └─────┘
//Line 03 $arr4 = $arr3; ---------- ┌──────┐ ┌─────┐ │ $a │ ──────────────────> │ 1 │ <─────────┐ └──────┘ └─────┘ │ ^ │ ┌─────────┐ │ │ │ $arr3 │ │ │ └─────────┘ │ │ │ │ │ │ │ │ └─────────> ┌────────────┐ │ │ │ Array │ │ │ │ container: │ │ │ ├────────────┤ │ │ │ [0] │ ───┘ │ ├────────────┤ ┌─────┐ │ │ [1] │ ───────> │ 1 │ │ ├────────────┤ └─────┘ │ │ [2] │ ───┐ │ └────────────┘ │ ┌─────┐ │ └───> │ 1 │ │ └─────┘ │ │ ┌─────────┐ │ │ $arr4 │ │ └─────────┘ │ │ │ │ │ └─────────> ┌────────────┐ │ │ Array │ │ │ container: │ │ ├────────────┤ │ │ [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]
.