Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial
  • Lezione 60 di 67
  • livello intermedio
Indice lezioni

Scope e argomenti facoltativi

Come gestire l'ambito delle variabili e gli argomenti facoltativi nelle funzioni
Come gestire l'ambito delle variabili e gli argomenti facoltativi nelle funzioni
Link copiato negli appunti

Lo scope delle variabili

Passiamo ora ad un altro argomento molto importante, che è l'ambito (scope) delle variabili. Infatti, le variabili utilizzate in una funzione esistono solo all'interno della funzione stessa, mentre non sono definite nè per le altre funzioni nè nello script principale. Allo stesso modo, le variabili usate dallo script principale non vengono viste dalle funzioni. Questa è una caratteristica molto importante del linguaggio, perchè ci permette di definire le funzioni con la massima libertà nel dare i nomi alle variabili al loro interno, senza doverci preoccupare che nel nostro script (o in qualche altra funzione) ci siano variabili con lo stesso nome il cui valore potrebbe risultare alterato. Questo significa, per tornare all'esempio precedente, che se avessimo scritto print $num2 all'esterno della funzione il_maggiore(), non avremmo ottenuto alcun risultato, e anzi avremmo ricevuto un errore di tipo notice, in quanto la variabile $num2, in quell'ambito, non è definita.

Le variabili utilizzate all'interno di una funzione si chiamano variabili locali. Le variabili utilizzate dallo script principale, invece, sono dette variabili globali.

Normalmente, quindi, se una funzione ha bisogno di un certo dato, è sufficiente includerlo tra i parametri che le dovranno essere passati. Tuttavia, esiste una possibilità per consentire ad una funzione di vedere una variabile globale: si tratta di dichiararla attraverso l'istruzione global.

function stampa($var1, $var2) {
global $a;
print $a;
}
$a = 'ciao a tutti';
$b = 'buongiorno';
$c = 'arrivederci';
stampa($b, $c); 

Questo codice, dopo avere definito la funzione stampa(), assegna un valore a tre variabili globali: $a, $b e $c. Viene poi chiamata la funzione stampa(), passandole i valori di $b e $c, che nella funzione si chiamano $var1 e $var2 ma che al suo interno non vengono utilizzati. Viene invece dichiarata la variabile globale $a, che è valorizzata con la stringa 'ciao a tutti', e quindi questo è ciò che viene stampato a video dall'istruzione print. Se non ci fosse l'istruzione "global $a", la variabile $a risulterebbe non definita all'interno della funzione, e quindi la print genererebbe un errore.

Noi comunque sconsigliamo di utilizzare le variabili globali in questo modo, perchè fanno perdere chiarezza allo script e alla funzione stessa.

Termine della funzione e valore restituito. Abbiamo visto in precedenza che la funzione termina con l'istruzione return, la quale può anche essere utilizzata per restituire un valore. Nel caso in cui non sia scopo della funzione quello di restituire un valore, utilizzeremo semplicemente return. Viceversa, nel caso in cui volessimo restituire più di un valore, siccome la sintassi di PHP ci consente di restituire una sola variabile, potremo utilizzare un array. Vediamo un esempio, immaginando una funzione il cui scopo sia quello di ricevere un numero e di restituire il suo doppio, il suo triplo e il suo quintuplo:

function multipli($num) {
$doppio = $num * 2;
$triplo = $num * 3;
$quintuplo = $num * 5;
$ris = array($doppio, $triplo, $quintuplo);
return $ris;
} 

Con questo sistema siamo riusciti a restituire tre valori da una funzione, pur rispettando la sintassi che ne prevede uno solo. Ovviamente quando richiameremo la funzione dovremo sapere che il risultato riceverà un array:

$a = 7;
$mul = multipli($a); // $mul sarà un array a 3 elementi

Se ci interessa, possiamo anche usare un costrutto del linguaggio per distribuire immediatamente i tre valori su tre variabili distinte:

list($doppio, $triplo, $quintuplo) = multipli($a);

Il costrutto list() serve ad assegnare i valori di un array (quello indicato a destra dell'uguale) ad una serie di variabili che gli passiamo fra parentesi. Ovviamente è possibile utilizzarlo non solo per "raccogliere" il risultato di una funzione, ma con qualsiasi array:

$arr = array('Marco','Paolo','Luca');
list($primo, $secondo, $terzo) = $arr;

In questo caso, $primo prenderà il valore 'Marco', $secondo il valore 'Paolo', $terzo il valore 'Luca'.

Un'ulteriore precisazione: poco fa abbiamo detto che la funzione termina con l'istruzione return. In realtà ciò non è necessario: infatti, nel caso in cui non ci siano valori da restituire, possiamo anche omettere l'istruzione return, e l'esecuzione della funzione terminerà quando arriverà in fondo al codice relativo, restituendo il controllo allo script principale (o ad un'altra funzione che eventualmente l'ha chiamata).

Argomenti facoltativi

In determinate situazioni possiamo prevedere delle funzioni in cui non è obbligatorio che tutti gli argomenti previsti vengano passati al momento della chiamata. Abbiamo visto, infatti, nella lezione precedente, che alcune funzioni di PHP prevedono dei parametri facoltativi. La stessa cosa vale per le funzioni definite da noi: se infatti, al momento in cui definiamo le funzioni, prevediamo un valore di default per un certo parametro, quel parametro diventerà facoltativo in fase di chiamata della funzione, e, nel caso manchi, la funzione utilizzerà il valore di default.

Come esempio consideriamo una funzione che stampa i dati anagrafici di una persona:

function anagrafe($nome, $indirizzo, $cf='non disponibile') {
   print "Nome: $nome<br />";
   print "Indirizzo: $indirizzo<br />";
   print "Codice fiscale: $cf<br />";
}

Questa funzione prevede tre parametri in input, ma per il terzo è previsto un valore di default (la stringa 'non disponibile'). Quindi, se la funzione viene chiamata con soltanto due argomenti, la variabile $cf avrà proprio quel valore; se invece tutti e tre gli argomenti vengono indicati, il valore di default viene ignorato. Vediamo due esempi di chiamata di questa funzione:

anagrafe('Mario Rossi', 'via Roma 2', 'RSSMRA69S12A944X');
anagrafe('Paolo Verdi', 'via Parigi 9');

Nel primo caso otterremo questo output a video:

Nome: Mario Rossi
Indirizzo: via Roma 2
Codice fiscale: RSSMRA69S12A944X

Nel secondo caso:

Nome: Paolo Verdi
Indirizzo: via Parigi 9
Codice fiscale: non disponibile

Nella seconda occasione il codice fiscale non è stato passato, e la funzione ha utilizzato il valore di default.

Ti consigliamo anche