Каковы преимущества передачи по ссылочному итератору в цикле foreach в PHP? - PullRequest
2 голосов
/ 16 июля 2010

Я только что прочитал ответ Билла Карвина .

Обратите внимание, что $node передается по ссылке.

Я всегда думал, что созданная там переменная только временная и существует только до конца цикла (или, может быть, она остается настроенной на последнюю итерацию - я ее не проверял).

Итак, в чем преимущества передачи по ссылке?

Я уверен, что есть, но пока не могу понять.

Ответы [ 2 ]

6 голосов
/ 16 июля 2010

Это не имеет ничего общего с тем, чтобы быть быстрее или эффективнее.

PHP реализует копирование при записи, поэтому переменная может ссылаться на ту же область памяти до тех пор, пока вы не измените ее значение. Затем, когда вы изменяете переменную, PHP решает, создавать ли копию или нет, в зависимости от того, обращаетесь ли вы к ней по значению или по ссылке.

Доступ по значению - при изменении переменной создается копия:

$a = array("abc");

foreach ($a as $element) {
  $element = "def";
}

print_r($a);

Array
(
    [0] => abc
)

Доступ по ссылке - изменения в переменной влияют на исходную копию:

foreach ($a as &$element) {
  $element = "def";
}

print_r($a);

Array
(
    [0] => def
)

Обратите внимание, что все объекты в PHP 5 доступны по ссылке без с использованием оператора &.
Это хорошая причина для использования объектов!

Будьте очень осторожны при использовании ссылок в PHP, потому что они могут иметь запутывающий эффект.

Обязательно прочитайте этот блог: Не используйте ссылки на PHP от разработчика ядра PHP Йоханнеса Шлютера

2 голосов
/ 16 июля 2010

Преимущество заключается в том, что он позволяет вам манипулировать массивом напрямую.

foreach ($array as $key => $node) {
    $array[$key]['foo'] = 'bar';
}

можно сделать короче и эффективнее, например:

foreach ($array as &$node) {
    $node['foo'] = 'bar';
}

В этом случае $nodeне копия содержимого записи массива, а ссылка на фактическую запись массива;все, что вы делаете с ним, вы делаете с массивом.

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