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

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

foreach ($my_array as $my_value) { } 

А также:

 foreach ($my_array as &$my_value) { } 

?

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

    В первом примере создается копия значения, а вторая использует ссылку на исходное значение. Поэтому после первого 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 

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

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

    1. Просто чтение значений:

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

       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

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

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

    Пример реального мира для & use – это когда вам нужно изменить содержимое массива с очень небольшим количеством строк кода

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