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

问题描述 投票:2回答:3

我正在尝试理解一些代码而且有些东西我没有得到。该代码使用对参数中的数组的引用和函数块中的引用。我创建了以下示例代码:

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"
}

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

php arrays function pass-by-reference
3个回答
0
投票

function some_function(&$ array){}将array-argument的第一个元素$ array [0]的地址作为引用地址。在函数内,重新分配仅改变了$ array [0]的值,因为$ array被重新分配以指向数组['somekey']的值,并在重新分配后更改为$ 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>";

?>

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都会显示相同的内容。


0
投票

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

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

阅读What References Are Not上的PHP手册

© www.soinside.com 2019 - 2024. All rights reserved.