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

标签 php reference pass-by-reference

这是什么意思“换句话说,数组的引用行为是在逐个元素的基础上定义的;各个元素的引用行为与数组容器的引用状态分离。”

单个元素如何与数组容器的引用状态分离?我正在彻底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为例,如果给$b赋值5,$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] 共享。

关于php - 单个元素的引用行为与数组容器的引用状态分离?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34065928/

相关文章:

php - 将变量从一个 WordPress 模板文件获取到另一个 WordPress 模板文件

java - 我面临这个问题 E/catch === : org. json.JSONException:SorrySignUpFirst 没有值

java - 在 Java 中,定义数组是为引用分配空间还是为对象本身分配空间?

c++ - 在 C++ 中初始化引用类型

c++ - 多个对象联网的问题

php - PHP 中的分割字符串

带有 While 循环的 PHP 表单仅发送最后一个 $_POST 复选框

c++ - 通过引用将对象参数传递给仿函数

javascript - 如何传递对带参数的函数的引用?

c# - 通过 ref 和 out