L'ultimo articolo scritto su Sir Bit risale a marzo 2014. La versione che state visitando è un archivio: le pagine sono accessibili come sempre e gli autori potrebbero rispondere ai commenti, ma non saranno inseriti dei nuovi articoli. Visita questa pagina per i dettagli.

PHP – Gestire e ottimizzare i parametri passati nelle funzioni

Una volta che si acquisisce dimestichezza con un linguaggio di programmazione, diventa cosa comune utilizzare ogni giorno delle comode funzioni per ridurre il più possibile il codice della pagina.
Ottimizzare l’esecuzione delle funzioni diventa utile, a volte persino necessario. Nel mio caso, faccio spesso uso di metodi di classe – che in quanto a gestione di base sono simili alle funzioni – e creare una struttura ottimizzata mi è fondamentale (a tale proposito, se vi interessa approfondire l’argomento della programmazione a oggetti in php date un’occhiata al mio articolo sulle classi).

In questo articolo vediamo un aspetto delle funzioni (e dei metodi di classe) spesso sottovalutato: come far passare in modo efficiente gli argomenti.
Come regola generale, io utilizzo un sistema semplice e che mi permette una certa flessibilità:
– se i parametri da passare sono obbligatori, li scrivo in chiaro come argomento a sé stante
– se i parametri sono facoltativi o di natura “secondaria” li faccio passare tutti assieme come elementi di un array

Tra poco vedremo un esempio che spiegherà meglio il concetto e l’utilità di utilizzare array come “contenitore di parametri”. Tengo a precisare di nuovo che si tratta di una regola generica, che non sempre applico: è il buon senso a stabilire quando e in che modo farne uso.

Per la comprensione di questo articolo si richiede una conoscenza di base dell’uso delle funzioni e degli array (per un ripasso di quest’ultimi, si può fare ricorso a un tutorial di base).

La descrizione del procedimento

Prima una descrizione veloce su quello che andremo a creare.
Si presume che sia presente una tabella nel database (chiamata per esempio “utenti”) i cui record sono persone fisiche. I campi su cui andremo a lavorare nell’esempio saranno quattro:
– id del record
– nome
– cognome
– sesso

La nostra idea è semplicemente di far passare questi campi alla funzione, che corrisponderanno ai campi nel database da modificare (ovvero su cui fare una query di update). I campi potranno essere elaborati a piacere prima dell’esecuzione della query (per esempio, controllando che “cognome” non sia vuoto).

Il richiamo della funzione

Prima di scorrere la funzione vera e proprio, per maggiore comprensione partiamo dal fondo, e cioè dal richiamo della funzione e dai parametri da passarle.
Nell’esempio qui sotto andremo a modificare il record che nel database ha “id=18″. Gli passeremo soltanto due campi da modificare:
– cognome=”Rossi”
– sesso=”f”

1
2
3
4
5
6
7
8
//id del record da modificare
$id_record = 18;
 
//campi da modificare
$parametri = array('cognome'=>'Rossi', 'sesso'=>'f');
 
//richiamo la funzione
$result = funzione_di_test($id_record, $parametri);

Come potete notare, passeremo i valori come parametri della funzione funzione_di_test. Ma mentre $id_record sarà un parametro a sé stante, i rimanenti valori saranno contenuti nell’array $parametri.

La funzione di esecuzione

Vediamo infine la funzione.
Se avete dimestichezza con funzioni e array in php, non avrete problemi a comprendere i commenti. In ogni caso, subito sotto vedremo i punti più particolari.


Nota: non ho inserito nessun controllo sui dati passati, che dovrete quindi preoccuparvi di aggiungere. Inoltre, ho mostrato soltanto il codice della funzione che ci interessa per lo scopo dell’articolo, cioè fino al salvataggio delle variabili affinché siano pronte all’uso. Eventuali query di update o altre operazioni si lasciano a vostra discrezione.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
function funzione_di_test($id, $parameters = null){
 
	//valori di default	
	$default_parameters = array(
		'nome' => 'Sconosciuto',
		'cognome' => '',
		'sesso' => 'm'
	);
 
	//se è stato passato qualche parametro all'array $parameters, faccio il merge tra questo e l'array di default, altrimenti prendo l'array di default
	//i parametri passati sovrascriveranno quelli di default
	if (is_array($parameters) and !empty($parameters)) {
		$ar = array_merge($default_parameters, $parameters);    
	} else {
		$ar = $default_parameters;
	}
 
	$id_record = $id;
	$nome = $ar['nome'];
	$cognome = $ar['cognome'];
	$sesso = $ar['sesso'];
 
	//DA QUI IN POI IL CODICE DA ESEGUIRE (ES: ESECUZIONE DELLA QUERY DI UPDATE)
	//NELL'ESEMPIO VIENE LASCIATO A TUA DISCREZIONE
 
}

L’array $default_parameters contiene tutti gli elementi facoltativi, ovvero che possono essere o meno passati dal programmatore. Per ognuno di questi elementi, associa un valore di default.

Cosa succede a questo punto? Se l’indice di array corrispondente è stato passato in $parameters, allora sarà il valore di quest’ultimo a essere preso; viceversa, sarà il valore di default a essere preso.
La funzione nativa di php array_merge si occupa esattamente di questo: prendere i valori di $parameters e sostituirli a quelli rispettivi di $default_parameters. Il risultato sarà l’array $ar, che conterrà i valori risultanti.

Riprendendo l’esempio con cui abbiamo richiamato la funzione, vediamo che abbiamo passato soltanto “cognome” e “sesso” in $parameters, mentre per “nome” prenderemo il valore di default.

1
2
3
//campi da modificare
$parametri = array('cognome'=>'Rossi', 'sesso'=>'f');
$result = funzione_di_test($id_record, $parametri);

In questo caso l’array $ar risulterà con questi valori:

1
2
3
echo $ar['nome']; // "Sconosciuto"
echo $ar['cognome']; // "Rossi"
echo $ar['sesso']; // "f"

L’utilità di un array contenitore come parametro

Qual è l’utilità di utilizzare un array al posto di un valore fisso? Vediamola con un esempio. Poniamo il caso che la nostra funzione fosse costruita in questo modo, dove “$id” è un valore obbligatorio da passare alla funzione, mentre “$nome” è un parametro che possiamo anche non passare:

1
2
3
function funzione_di_test($id, $nome = ''){
...
}

Nei vari codici del nostro sito, ci sarranno alcune volte in cui passeremo anche il parametro “nome” e alle volte in cui non lo passeremo. Per esempio:

1
2
$result = funzione_di_test(10, 'Francesco');
$result2 = funzione_di_test(15);

1) Comodità
La prima cosa che salta all’occhio è la comodità rappresentata da $default_parameters, che ci permette di inserire dei valori di default per tutti quei parametri che non vengono passati.
Certo, avremo potuto far passare i parametri con valori di default direttamente come argomento della funzione. Ma volete mettere la comodità di utilizzare una semplice funzione di array_merge per stabilire se prendere i valori di default oppure quelli passati?

2) Eleganza
Mettiamo il caso che in futuro ci accorgiamo di dover aggiungere un parametro “partita_iva” alla funzione funzione_di_test. La funzione diventa:

1
2
3
function funzione_di_test($id, $nome = '', $partita_iva = ''){
...
}

Se dovessimo aggiungere la partita iva al richiamo immagazzinato in “$result2”, saremmo costretti a lasciare uno spazio vuoto come parametro:

1
$result2 = funzione_di_test(15, '', '12345678912');

Non ci sarebbe niente di male, è solo uno spazio vuoto. Ma immaginate se la funzione accettasse numerosi parametri, alcuni facoltativi e altri meno: saremo costretti a “compilare” lo spazio dei parametri facoltativi che non passiamo lasciandoli tutti vuoti.
Se invece facciamo uso di un array come $parameters, ci basta aggiungere un elemento nell’array per ogni valore da passare, ignorando completamente i valori facoltativi.

Etichette
Etichette:,
Ultimi Commenti
  1. davide

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.