Php: qual è la differenza tra $ var e & $ var?

Qual è la differenza tra

foreach ($my_arrays as $my_value) { } 

E:

 foreach ($my_arrays as &$my_value) { } 

?

Posso chiederti di darmi due esempi del mondo reale su quando usarne uno e quando usi l'altro?

Il primo esempio crea una copia del valore, mentre il secondo usa un riferimento al valore originale. Quindi, dopo la prima esecuzione di foreach , l'arrays originale è ancora intatto. Dopo il secondo foreach l'arrays originale avrebbe potuto essere modificato poiché era gestito per riferimento.

Alcune funzioni PHP native funzionano già in questo modo, come shuffle() che riorganizza il contenuto dell'arrays. Noterai che questa function non restituisce un arrays, basta chiamarlo:

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

E funziona la sua magia dal momento che lavora con l'arrays per riferimento piuttosto che crearne una copia.

Poi ci sono funzioni che non passano nulla per riferimento, ma gestiscono piuttosto una copia del valore originale, come ucwords() che restituisce la nuova string risultante:

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

Vedi Passaggio per riferimento .

Le risposte di Jonathan lo descrivono molto bene. Solo per completezza, ecco i tuoi due esempi:

  1. Basta leggere valori:

     $my_arrays = range(0,3); foreach ($my_arrays as $my_value) { echo $my_value . PHP_EOL; } 
  2. Aggiunta di un numero a ciascun elemento ( modificando così each valore):

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

    Se non utilizzi &$my_value , l'aggiunta non avrà alcun effetto su $my_arrays . Ma potresti scrivere lo stesso senza usare riferimenti:

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

    La differenza è che stiamo accedendo / modificando il valore originale direttamente con $my_arrays[$key] .

DEMO

Quando prefissi una variabile con una e commerciale, stai creando un "riferimento". I riferimenti PHP sono come scorciatoie o collegamenti simbolici sul tuo computer. È ansible creare una variabile puntatore che è solo un altro nome per gli stessi dati.

Non vedo una grande differenza nell'usarli, tranne che NON COPIARE una memory a risparmio variabile. Quando si passano variables, è sufficiente passare il riferimento e i punti di riferimento all'object originale.

Un esempio di mondo reale per & use è quando è necessario modificare il contenuto di un arrays con pochissime righe di codice

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