Named Arguments in PHP 8: chiamare funzioni con chiarezza
Sintassi, ordine arbitrario, combinare con positional e array_fill_keys
Guardiamo questa chiamata: str_pad('Hi', 9, ' ', STR_PAD_BOTH). Cosa fa il terzo ' '? E il quarto argomento? Da PHP 8.0, i named arguments risolvono esattamente questo: puoi passare i valori con il nome del parametro, non solo per posizione.
La differenza tra dettare un indirizzo a voce («gira alla terza, poi ancora a destra, poi dritto») e scriverlo su un modulo con i campi etichettati: «via», «numero civico», «città». Il modulo etichettato non lascia dubbi su cosa va dove.
1. La sintassi: nome del parametro + due punti
Un named argument si scrive con il nome del parametro (senza il $) seguito da due punti e dal valore:
// Posizionale: devi ricordare l'ordine esatto
array_fill(0, 100, 50);
// Named arguments: il significato è scritto nella chiamata stessa
array_fill(
start_index: 0,
count: 100,
value: 50
);
Il nome del parametro deve essere scritto letteralmente: non puoi metterlo in una variabile ($nomeParam: $valore non è consentito).
Fonte: PHP Manual: «Function arguments»: Named argument syntax (php.net).
2. L'ordine non conta più
Con i named arguments l'ordine in cui scrivi i valori è irrilevante: PHP li assegna comunque al parametro giusto, guardando il nome.
array_fill(value: 50, count: 100, start_index: 0); // identico al precedente, ordine invertito
Il vantaggio più pratico: puoi saltare gli argomenti opzionali che non ti interessano, senza dover ripetere tutti i valori di default che li precedono.
// Voglio cambiare SOLO "double_encode";
// tutti gli altri parametri mantengono il valore predefinito
htmlspecialchars(
$string,
double_encode: false
);
// Senza named arguments avresti dovuto specificare
// anche tutti i parametri precedenti
htmlspecialchars(
$string,
ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401,
'UTF-8',
false
);
Immagina di ordinare un panino "senza cipolla": dici solo cosa vuoi cambiare rispetto alla ricetta standard, senza dover rielencare ogni singolo ingrediente.
3. Combinare named e positional: una regola sola
Puoi mescolare i due stili in un'unica chiamata, con una regola fissa: i positional vengono sempre prima, i named dopo. Il contrario genera un errore.
// OK: prima gli argomenti posizionali, poi quelli nominali
htmlspecialchars(
$string,
double_encode: false
);
// ERRORE: un argomento posizionale non può essere inserito
// dopo un argomento nominale
setcookie(
name: 'test',
'valore',
path: '/'
);
// Fatal error:
// Cannot use positional argument after named argument
Un'altra protezione: passare due volte un valore allo stesso parametro (per esempio un positional e un named che puntano alla stessa posizione) lancia un Error, non lo sovrascrive silenziosamente.
function foo($param)
{
}
foo(
1,
param: 2
);
// Error:
// Named parameter $param overwrites previous argument
Fonte: PHP Manual: «Function arguments»: i named arguments devono seguire i positional; errore su parametro passato due volte (php.net).
4. Named arguments «dinamici» con array_fill_keys()
I named arguments funzionano anche quando spacchetti un array con l'operatore ...: se le chiavi dell'array sono stringhe, PHP le tratta come nomi di parametro.
function formatName(
string $first,
string $middle,
string $last
): string {
return "$first $middle $last";
}
$dati = [
'first' => 'Ada',
'middle' => '',
'last' => 'Lovelace',
];
echo formatName(...$dati);
// L'array viene spacchettato come named arguments
Qui entra array_fill_keys(): costruisce rapidamente un array associativo dato un elenco di chiavi e un valore da ripetere. Comodo per preparare in modo dinamico un set di named arguments: per esempio per impostare un valore di default identico su più parametri prima di sovrascriverne qualcuno:
// Prepara tre parametri tutti impostati a 0
$opzioni = array_fill_keys(
['x', 'y', 'z'],
0
);
// Risultato:
// [
// 'x' => 0,
// 'y' => 0,
// 'z' => 0,
// ]
// Sovrascrive solo il parametro necessario
$opzioni['y'] = 10;
muoviPunto(...$opzioni);
// Named arguments generati a runtime
Fonte: PHP Manual: «array_fill_keys»; «Function arguments»: string keys nell'unpacking sono trattate come named arguments (php.net).
In sintesi
| Regola | Cosa significa | Esempio |
|---|---|---|
| Sintassi | nome: valore, nome letterale (no variabili) | count: 100 |
| Ordine libero | Non conta l'ordine di scrittura | array_fill(value:50, count:100, start_index:0) |
| Salta i default | Cambi solo ciò che ti serve | htmlspecialchars($s, double_encode:false) |
| Combinare | Positional prima, named dopo | foo($a, b:2, c:3) |
| Doppio valore | Errore, non sovrascrittura silente | Error: overwrites previous argument |
| Unpacking dinamico | Array con chiavi stringa + ... | formatName(...$dati) |
I named arguments non sono solo zucchero sintattico: rendono la chiamata autodocumentata, chi legge il codice capisce cosa fa ogni valore senza aprire la definizione della funzione.
Per approfondire
- OOP PHP: classi, oggetti, costruttore, distruttore: i named arguments sono comodissimi proprio quando chiami un costruttore.
Commenti (0)
Registrati per commentare, fare domande e proporre l'argomento della prossima pillola (oppure accedi se hai già un account).
Nessun commento. Sii il primo a scrivere qualcosa.