Подтвердить что ты не робот

Php: какая разница между $var и & $var?

В чем разница между

foreach ($my_array as $my_value) {
}

и

foreach ($my_array as &$my_value) {
}

?

Могу ли я попросить вас дать мне два реальных примера, когда их использовать, а когда вы используете другой?

4b9b3361

Ответ 1

В первом примере создается копия значения, а вторая использует ссылку на исходное значение. Таким образом, после первого запуска foreach исходный массив все еще остается нетронутым. После второго foreach исходный массив мог быть изменен, так как он обрабатывался ссылкой.

Некоторые встроенные функции PHP уже работают таким образом, как shuffle(), который перестраивает содержимое вашего массива. Вы заметите, что эта функция не возвращает массив, вы просто называете это:

$myArray = array('foo', 'bar', 'fizz', 'buzz');
shuffle( $myArray );
// $myArray is now shuffled

И он работает своей магией, поскольку он работает с массивом по ссылке, а не создает его копию.

Тогда есть функции, которые ничего не передают по ссылке, а скорее имеют дело с копией исходного значения, например ucwords() который возвращает новую результирующую строку:

$myString = "hello world";
$myString = ucwords( $myString );
// $myString is now capitalized

См. Передача по ссылке.

Ответ 2

ответы Джонатана описывает это очень хорошо. Просто для полноты, вот ваши два примера:

  • Просто значения чтения:

    $my_array = range(0,3);
    foreach ($my_array as $my_value) {
        echo $my_value . PHP_EOL;
    }
    
  • Добавление некоторого числа в каждый элемент (таким образом, изменение каждого значения):

    foreach ($my_array as &$my_value) {
        $my_value += 42;
    }
    

    Если вы не используете &$my_value, добавление не окажет никакого влияния на $my_array. Но вы можете написать то же самое, не используя ссылки:

    foreach($my_array as $key=>$value) {
        $my_array[$key] = $value + 42;
    }
    

    Отличие состоит в том, что мы обращаемся к/изменяем исходное значение непосредственно с помощью $my_array[$key].

DEMO

Ответ 3

Когда вы префикс переменной с амперсандом, вы создаете "ссылку". Ссылки PHP похожи на ярлыки или символические ссылки на вашем компьютере. Вы можете создать переменную указателя, которая является просто другим именем для тех же данных.

Я не вижу большой разницы в их использовании, за исключением того, что вы НЕ ДОЛЖНЫ КОПИРОВАТЬ переменную, сохраняющую память. Когда вы передаете переменные, вы можете просто передать ссылку и контрольные точки на исходный объект.

Ответ 4

Пример реального мира и его использование - это когда вам нужно изменить содержимое массива с очень небольшим количеством строк кода

foreach($arrFeed as &$objFeed)
  $objFeed['externalSrc'] = convertToLocalImage($objFeed['externalSrc']);