PHP: почему массив не изменяется при использовании ссылки в вызове функции? - PullRequest
0 голосов
/ 08 сентября 2018

Я пытаюсь понять какой-то код, а кое-что я не понимаю. Код использует ссылку на массив в аргументах и ​​ссылку на функциональный блок. Я создал следующий пример кода:

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 голосов
/ 09 сентября 2018

Второе назначение не игнорируется. Давайте разберем код построчно.

$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 голосов
/ 09 сентября 2018

function some_function (& $ array) {} принимает адрес первого элемента $ array [0] аргумента array в качестве ссылочного адреса. Внутри функции переназначения просто изменили значение в $ array [0], так как $ array был переназначен на point на значение в array ['somekey'] и изменен на $ 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>";

?>
0 голосов
/ 09 сентября 2018

Поскольку ссылки не работают как указатели C.

Невозможно связать $ my_array в области вызова с чем-либо другим, используя механизм ссылок, поскольку $ my_array недоступен в функции some_function()

Прочтите руководство по PHP на Что не является ссылками

...