Una funzione PHP si definisce con la parola chiave function, un nome, una lista di parametri e un corpo; return restituisce un valore a chi chiama. function add(int $a, int $b): int { return $a + $b; } la definisce, e add(2, 3) la chiama e restituisce 5.
string e int prima dei parametri sono dichiarazioni di tipo, e : string dopo le parentesi è il tipo restituito. Entrambi sono facoltativi, ma intercettano presto gli errori e documentano cosa si aspetta la funzione.
Valori restituiti e restituire più valori
return termina subito la funzione. Una funzione senza return, o con un semplice return;, restituisce null; dichiara : void quando viene chiamata solo per il suo effetto. Una funzione restituisce un solo valore, ma quel valore può essere un array, che destrutturi dal lato di chi chiama:
Vedi la destrutturazione degli array per le altre forme di [...] =.
Parametri di default e argomenti con nome
Un parametro con = valore è facoltativo: chi chiama può ometterlo. I parametri facoltativi vanno dopo quelli obbligatori. Da PHP 8.0, gli argomenti con nome permettono a chi chiama di passare qualsiasi parametro tramite il nome, così puoi saltare quelli facoltativi che non ti servono.
Gli argomenti con nome rendono leggibili anche le chiamate alle funzioni predefinite: str_pad('7', 3, '0', pad_type: STR_PAD_LEFT). Il nome del parametro diventa parte dell'interfaccia pubblica della funzione, quindi rinominare un parametro può rompere il codice che usa i nomi.
Passaggio per riferimento
Normalmente PHP passa una copia di ogni argomento, quindi la funzione non può modificare la variabile del chiamante. Una & prima di un parametro passa la variabile stessa. Le funzioni predefinite come sort() funzionano così.
Restituire un nuovo valore è di solito più chiaro che modificare un argomento. Usa i riferimenti quando la funzione deve davvero modificare qualcosa sul posto.
Dichiarazioni di tipo e strict_types
Di default PHP converte gli argomenti nel tipo dichiarato quando può: add("5", 3) trasforma "5" in 5. Mettere declare(strict_types=1); proprio in cima al file disattiva questo comportamento per le chiamate fatte in quel file, quindi un tipo sbagliato lancia un TypeError invece di essere convertito.
Senza la riga declare, la stessa chiamata stampa 8. Le stringhe che non sono numeri, come "five", lanciano un TypeError in entrambe le modalità.
I tipi che puoi dichiarare per parametri e valori restituiti:
never è un tipo restituito per le funzioni che lanciano sempre un'eccezione o terminano lo script. Anche i nomi di classi e interfacce funzionano come tipi.
Numero variabile di argomenti con ...$args
...$numbers raccoglie un numero qualsiasi di argomenti in un array. Gli stessi ... dal lato della chiamata espandono un array in argomenti separati.
Usare una variabile esterna dentro una funzione
Una funzione ha il suo scope. Una variabile definita fuori non è visibile dentro, cosa che sorprende chi arriva da JavaScript:
<?php
$taxRate = 0.2;
function priceWithTax(float $price): float
{
return $price * (1 + $taxRate); // $taxRate is undefined here
}
Warning: Undefined variable $taxRate in /path/to/index.php on line 6
e la funzione restituisce il prezzo senza tasse. Passa invece il valore come parametro. Così la funzione dichiara chiaramente da cosa dipende ed è facile da testare:
Funziona anche la parola chiave global, ma nasconde la dipendenza; lo scope delle variabili la tratta. Per le funzioni brevi passate ad altre funzioni, come le callback di array_map(), vedi le funzioni anonime, che possono catturare variabili esterne con use.
Domande frequenti
Come definisco una funzione in PHP?
Usa la parola chiave function, un nome, i parametri tra parentesi e un corpo: function add(int $a, int $b): int { return $a + $b; }. Chiamala con add(2, 3). I nomi delle funzioni non distinguono maiuscole e minuscole, e una funzione definita al livello principale di un file si può chiamare prima della riga che la definisce.
Come restituisco più valori da una funzione PHP?
Restituisci un array e destrutturalo: function minMax(array $a): array { return [min($a), max($a)]; } poi [$min, $max] = minMax([3, 1, 4]);. Per risultati con nome, restituisci un array associativo e usa ['min' => $min] = ....
Cosa fa declare(strict_types=1)?
Disattiva la conversione automatica dei tipi per le chiamate fatte da quel file, quindi passare "5" a un parametro int lancia un TypeError invece di convertirlo in 5. Deve essere la primissima istruzione del file e influisce solo su quel file.
Cosa sono gli argomenti con nome in PHP?
Da PHP 8.0 puoi passare gli argomenti tramite il nome del parametro: htmlspecialchars($s, double_encode: false). Si possono dare in qualsiasi ordine dopo quelli posizionali, e permettono di saltare i parametri facoltativi che non vuoi cambiare.
Come passo una variabile per riferimento in PHP?
Metti & prima del parametro: function addOne(int &$n): void { $n++; }. La funzione modifica allora la variabile del chiamante. Senza &, PHP passa una copia e la variabile del chiamante resta uguale.