Negli esempi precedenti abbiamo passato alle funzioni delle variabili, che ricordiamo essere delle locazioni di memoria che contengono dei dati. Se provassimo a modificare il contenuto di una variabile dichiarata esternamente utilizzando una funzione, cosa succederebbe?
Vediamolo.
<?php $num=7; function changeValue($number){ echo ++$number."\n"; } echo $num."\n";//Prima echo changeValue($num); echo $num."\n";//Seconda echo //In output avremo: //7 //8 //7 ?>
Come possiamo notare dal risultato, nel momento in cui, esternamente alla funzione, abbiamo chiesto al comando php echo (Seconda echo) di mostrarci cosa c’è nella variabile $num dopo la function, il risultato è stato identico a quello che ci ha mostrato l’echo prima della chiamata della funzione (Prima echo). Questo è successo perché, in questo caso, richiamando la funzione, le abbiamo passato delle variabili per valore (vale a dire una copia).
Esistono quindi due diverse modalità di passaggio dei parametri a una funzione “per valore e per riferimento“
- Per valore: stiamo passando e manipolando una copia della variabile presente nella locazione di memoria
- Per riferimento: stiamo passando proprio il contenuto della locazione di memoria senza farne prima una copia
Il passaggio per valore a codice avviene tramite un “&” posta vicino al parametro formale della funzione
<?php $num=7; function changeValue(&$number){ echo ++$number."\n";//Incrementa il valore di $number di uno } echo $num."\n";//Prima echo changeValue($num); echo $num."\n";//Seconda echo //In output avremo: //7 //8 //8 ?>
Adesso il php echo immediatamente sotto la chiamata della funzione (Seconda echo) ci mostra un risultato diverso rispetto all’echo prima della chiamata della funzione (Prima echo) perché la funzione ha modificato l’interno della locazione di memoria a differenza della funzione che riceve una copia del contenuto della variabile.