Search code examples
phparraysreferencepass-by-referencepass-by-value

Are arrays in PHP copied as value or as reference to new variables, and when passed to functions?


1) When an array is passed as an argument to a method or function, is it passed by reference, or by value?

2) When assigning an array to a variable, is the new variable a reference to the original array, or is it new copy?
What about doing this:

$a = array(1,2,3);
$b = $a;

Is $b a reference to $a?


Solution

  • For the second part of your question, see the array page of the manual, which states (quoting) :

    Array assignment always involves value copying. Use the reference operator to copy an array by reference.

    And the given example :

    <?php
    $arr1 = array(2, 3);
    $arr2 = $arr1;
    $arr2[] = 4; // $arr2 is changed,
                 // $arr1 is still array(2, 3)
    
    $arr3 = &$arr1;
    $arr3[] = 4; // now $arr1 and $arr3 are the same
    ?>
    


    For the first part, the best way to be sure is to try ;-)

    Consider this example of code :

    function my_func($a) {
        $a[] = 30;
    }
    
    $arr = array(10, 20);
    my_func($arr);
    var_dump($arr);
    

    It'll give this output :

    array
      0 => int 10
      1 => int 20
    

    Which indicates the function has not modified the "outside" array that was passed as a parameter : it's passed as a copy, and not a reference.

    If you want it passed by reference, you'll have to modify the function, this way :

    function my_func(& $a) {
        $a[] = 30;
    }
    

    And the output will become :

    array
      0 => int 10
      1 => int 20
      2 => int 30
    

    As, this time, the array has been passed "by reference".


    Don't hesitate to read the References Explained section of the manual : it should answer some of your questions ;-)