The reference behavior of individual elements is dissociated from the reference status of the array container?

后端 未结 1 447
误落风尘
误落风尘 2021-01-14 06:50

What does this mean \"In other words, the reference behavior of arrays is defined in an element-by-element basis; the reference behavior of individual elements is dissociate

1条回答
  •  挽巷
    挽巷 (楼主)
    2021-01-14 07:23

    I think if you use some ASCII art you might understand it better:

    First example:

    //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  │
    └──────┘                       └─────┘
    

    Now as you can see when you assign a variable by reference and you change it, it will also change the value for the other variable. Here for example $a and $b, if you assign 5 to $b, $a will also point to 5, vice versa.

    But you didn't assigned $b to $c by reference (you made a normal by value assignment), so if you change the value of $c it won't change the value of $b (, or $a).

    Second example:

    //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]  │   ──────────────────────┘
    └────────────┘     
    

    Now here comes the line what the manual is trying to explain:

    $arr2 = $arr;
    

    Even though you don't assign the array $arr by reference to $arr2, the array still holds an element which points to a reference! And that reference will still be in $arr2, so the first element of the second array also points to the reference as $arr[0] and $a does.


    Maybe if you see the difference when an array is assigned by reference and when an array holds an element with a reference you understand it better:

    Array assigned by reference:

    //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  │         
    └─────────┘   
    

    So as you can see here, since you assigned $arr1 to $arr2 by reference they both point to the same array.

    Array containing a reference:

    //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  │
                                             └─────┘
    

    So as you can see here even though you assigned $arr3 to $arr4 by value, not by reference! The array still contains that reference, which is shared with $a and $arr3[0].

    0 讨论(0)
提交回复
热议问题