PHP:为什么在函数调用中使用引用时数组没有更改?

时间:2018-09-08 20:58:53

标签: php arrays function pass-by-reference

我试图理解一些代码,但有些东西我还是没有。 该代码使用对参数中数组的引用和功能块中的引用。我创建了以下示例代码:

function some_function(&$array)
{
    // assign a value to a new key in the empty array
    $array['somekey'] = 'somevalue';

    // set the array to reference this key
    $array = &$array['somekey'];

    // var_dump() of the array shows 'somevalue'
    var_dump($array);
}

$my_array = [];
some_function($my_array);

// var_dump() now shows the initial value of ['somekey'] => 'somevalue' ???
var_dump($my_array);

下面是2个var_dumps的输出。

string(9) "somevalue"
array(1) {
  ["somekey"]=>
  string(9) "somevalue"
}

我的问题是:为什么离开函数后第二个赋值会被忽略?

3 个答案:

答案 0 :(得分:0)

因为引用不能像C指针那样工作。

  

由于引用函数my_array在some_function()函数中不可用,因此无法使用引用机制将调用范围中的$ my_array绑定到其他对象。

阅读What References Are Not

上的PHP手册

答案 1 :(得分:0)

第二项分配不会被忽略。让我们逐行细分代码。

$my_array = [];
some_function($my_array);

function some_function(&$array)
{

现在,符号$my_array(在全局范围内)和符号$array(在函数的本地范围内)都引用了相同的空数组。

// assign a value to a new key in the empty array
$array['somekey'] = 'somevalue';

这将修改数组,并且两个符号仍引用它。

// set the array to reference this key
$array = &$array['somekey'];

此行告诉PHP,符号$array现在应引用字符串'somevale'。但是符号$my_array不受它的影响。如果要更改两个符号都引用的值,只需使用常规分配即可:

$array = $array['somekey'];

和两个var_dumps将显示相同。

答案 2 :(得分:0)

function some_function(&$ array){}将 array-argument 的第一个元素$ array [0]的地址作为参考地址。在函数中,重新分配只是将$ array [0]的值更改为$ array,将$ array的值重新分配为 point ,将其更改为 array ['somekey'] ,并将值更改为<重新分配后,strong> $ array 会更改 array ['somekey'] 的值。

<?php 
function some_function(&$array)
{
    // assign a value to a new key in the empty array
    $array['somekey'] = 'somevalue';

    echo gettype($array);
    echo "<br>";
    var_dump($array);
    echo "<br>";
    // set the array to reference this key
    $array = &$array['somekey'];


    // var_dump() of the array shows 'somevalue'
    var_dump($array);
    echo "<br>";
    echo gettype($array);
    echo "<br>";
    $array='different value';
    echo "<br>";
    echo gettype($array);
    echo "<br>";
    var_dump($array);
}

    $my_array = [];
    echo "<br><br>";
    var_dump($my_array);
    some_function($my_array);

    echo "<br><br>";
    // var_dump() now shows the initial value of ['somekey'] => 'somevalue' ???
    var_dump($my_array); // ['somekey'] shows 'different value' because the value was changed in the function.
    echo "<br><br>";
    echo gettype($my_array);
    echo "<br><br>";

?>