Parliamo ora di come il PHP passa gli argomenti alle funzioni quando queste vengono chiamate.
Per default tutti i parametri vengono sempre passati per valore ciò vuol dire che al momento della chiamata viene fatta una copia del valore di ogni variabile e solo questa copia viene usata dalla funzione.
Così facendo se all’interno della funzione il valore viene in qualche modo modificato, il cambiamento non si propaga anche dopo la chiamata.
<?php /* funzione di esempio */ function modifica_i_parametri ($p1, $p2) { $p1 = 10; $p2 *= $p1; } /* variabili da modificare */ $a = 5; $b = 7; /* Chiama una funzione che tenta di modificare i parametri ma $a e $b rimangono uguali anche dopo la chiamata perché il passaggio è per valore */ modifica_i_parametri ($a, $b); ?>
Ora, come abbiamo visto, questo può essere utile ma a volte capita di volere che anche la variabile sorgente risenta del cambiamento, come fare quindi?
Basta usare il passaggio per riferimento. Grazie all’operatore & è possibile passare una variabile alla funzione per riferimento.
Se questo operatore viene messo nella dichiarazione della funzione l’operatore verrà passato sempre per riferimento mentre se inserito solo al momento della chiamata starà a noi decidere quando usarlo.
<?php /* funzione che modifica sempre il suo parametro */ function metti10 (&$p) { $p = 10; } /* questa funzione invece non riesce sempre */ function metti100 ($x) { $x = 100; } /* esempi */ $a = 9; metti10 ($a); /* ora $a contiene 10 */ metti100 ($a); /* $a contiene ancora 10 */ metti100 (&$a); /* ora $a contiene 100 visto che abbiamo specificato il passaggio per riferimento */ ?>
vicius
complimenti per la spiegazione; chiarissimo => 10 e lode 🙂
Salve, in realtà passare il valore per riferimento in questo modo -> metti100 (&$a); non viene più accettato già da php 5
errore = (Call-time pass-by-reference has been removed;)
php 7 segnala invece un errore di sintassi
quindi possiamo decidere se passare per riferimento solo nel momento in cui andiamo a creare la funzione e non alla sua invocazione
Hai perfettamente ragione! La guida è stata scritta diversi anni fa: al tempo era un’istruzione valida.
Penso di non modificare l’articolo però chi leggerà il commento potrà prendere atto di questa imprecisione 🙂