понимание использования ссылок - PullRequest
1 голос
/ 27 июня 2010

я думал, что я понимаю, что делают ссылки. но теперь я встречаю пример, который все равно не может понять.

я видел интересный скрипт здесь , но почему он использует & в этом скрипте, я не могу понять. вот часть сценария

foreach ($nodeList as $nodeId => &$node) 
{
    if (!$node['id_parrent'] || !array_key_exists($node['id_parrent'], $nodeList)) 
    {
        $tree[] = &$node;
    } 
    else 
    {
        $nodeList[$node['id_parrent']]['children'][] =&$node;
    }
}

если он не вносит изменений на $ node, зачем здесь использовать ссылки? нет ничего похожего на $node = any changes, поэтому зачем использовать = & $ node вместо $ node?

Может быть, вы поможете мне понять?

Спасибо

Ответы [ 3 ]

2 голосов
/ 27 июня 2010

$tree[] = &$node;

Когда вы делаете это так, массив деревьев будет хранить ссылки на те же узлы, что и в списке узлов.Если вы измените узел из списка узлов, он будет изменен и в дереве, и наоборот.То же самое относится и к массиву children.

Без использования ссылок массив tree и children просто будет содержать копию узла.

1 голос
/ 27 июня 2010

Я бы посоветовал вам взглянуть на:

PHP: передача по ссылке или передача по значению

Это легко демонстрирует, почему вам нужно передавать переменныепо ссылке (&).

Пример кода:

function pass_by_value($param) {
  push_array($param, 4, 5);
}

$ar = array(1,2,3);

pass_by_value($ar);

foreach ($ar as $elem) {
  print "<br>$elem";
}

Приведенный выше код выводит 1, 2, 3. Это потому, что массив передается как значение.

function pass_by_reference(&$param) {
  push_array($param, 4, 5);
}

$ar = array(1,2,3);

pass_by_reference($ar);

foreach ($ar as $elem) {
  print "<br>$elem";
}

Приведенный выше код выводит 1, 2, 3, 4, 5. Это потому, что массив передается как ссылка, то есть функция (pass_by_reference) не манипулирует копией переданной переменной, но фактическая переменная сама.

1 голос
/ 27 июня 2010

, если он не вносит никаких изменений в $ node, зачем здесь использовать ссылки?нет ничего подобного $ node = каких-либо изменений, поэтому зачем использовать = & $ node вместо $ node?

Поскольку использование ссылки также избавляет вас от копирования переменной, тем самым экономя память и (вобычно незначительное измерение) производительность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...