单个元素的引用行为与数组容器的引用状态分离?

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].

共享