php Beginner 3 min

Named Arguments in PHP 8: chiamare funzioni con chiarezza

Sintassi, ordine arbitrario, combinare con positional e array_fill_keys

· 673 parole

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

Accedi o registrati per votare, salvare o commentare la pillola

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.

Pillole correlate