empty($var) restituisce true se la variabile non esiste o se il suo valore è falsy: null, false, 0, 0.0, "", "0" o un array vuoto []. Per qualsiasi altro valore restituisce false. Come isset(), non genera mai warning per variabili o chiavi di array non definite.
empty($x) equivale a !isset($x) || !$x. In altre parole: manca, oppure si converte in false.
Quali valori sono vuoti
Scegli un valore nella tabella per vedere empty() accanto a isset() e al cast (bool). Ogni cella è stata calcolata da PHP 8.3.
| $x | empty | isset | bool |
|---|---|---|---|
| null | |||
| false | |||
| 0 | |||
| 0.0 | |||
| "" | |||
| "0" | |||
| [] | |||
| " " | |||
| "0.0" | |||
| "a" | |||
| "null" | |||
| [0] | |||
| 1 | |||
| -1 |
Le sorprese sono ai due estremi: "0" è vuoto, mentre " " (uno spazio), "0.0", "null" e [0] non lo sono.
"0" è vuoto: il bug classico
Dato che "0" è falsy, empty() tratta una quantità 0, un punteggio 0 o un PIN "0" come "nessun valore inserito". Succede spesso nei form, dove ogni valore arriva come stringa.
Per l'input testuale, il controllo affidabile per "nessun valore inserito" è trim($value) === "". Tieni empty() per i valori in cui 0 significa davvero niente.
Verificare se una stringa è vuota
Per verificare esattamente una stringa vuota, confronta con "". Per considerare vuoti anche gli spazi, applica prima trim. Da PHP 5.5 empty() accetta espressioni, quindi funziona anche empty(trim($s)) (ma con lo stesso problema di "0").
Da PHP 8.1 trim() non accetta null senza un avviso di deprecazione, ed è per questo che il blocco scrive trim($s ?? "").
Verificare se un array è vuoto
Per gli array, empty($arr), $arr === [] e count($arr) === 0 danno tutti la stessa risposta. empty() ha il vantaggio di funzionare su una variabile o una chiave che potrebbe non esistere.
array_filter() senza callback rimuove ogni valore falsy, quindi è un modo rapido per chiedere "questo array contiene qualcosa di concreto".
Validare un campo obbligatorio di un form
!empty() è un modo comune per rendere obbligatorio un campo, purché 0 non sia una risposta valida. Esegui questo blocco, lascia vuoti i campi e premi Send, poi compilali e invia di nuovo: lo script viene eseguito ancora con $_POST compilato.
Per la checkbox empty($_POST["terms"]) copre entrambi i casi: non inviata affatto, oppure inviata con un valore vuoto. La pagina sui form va oltre con messaggi di errore per ogni campo.
empty vs isset
Entrambi sono sicuri su variabili e chiavi non definite. Rispondono a domande diverse:
isset($x): esiste e non ènull? Usalo per chiavi facoltative, checkbox e "è stato inviato o no".!empty($x): esiste ed è truthy? Usalo per "contiene qualcosa di concreto", quando0e"0"non contano.$x === ""o$x === []: è esattamente vuoto? Usalo quando0è un valore valido.
La pagina su isset copre l'altra metà, compreso isset() con più variabili insieme e la differenza da array_key_exists().
Domande frequenti
Quali valori considera vuoti empty() in PHP?
empty($x) è true quando $x non esiste oppure è null, false, 0, 0.0, "", "0" o []. Tutto il resto non è vuoto, compresi " " (uno spazio), "0.0", "false" e [0].
Perché "0" è vuoto in PHP?
empty() equivale a !$x senza il warning per le variabili non definite, e la stringa "0" si converte in false. Per questo empty() è sbagliato per i campi in cui 0 è una risposta valida; controlla invece $x === '' o trim($x) === ''.
Come verifico se un array è vuoto in PHP?
Funzionano sia empty($arr) sia $arr === [], e anche count($arr) === 0. empty() restituisce true anche quando la variabile non è impostata, mentre count() su una variabile non definita genererebbe un warning e poi lancerebbe un TypeError per null.
Quando usare empty() invece di isset()?
Usa isset() quando ti basta sapere che un valore esiste (una checkbox è stata inviata, una chiave di configurazione è presente). Usa !empty() quando il valore deve anche essere non vuoto, per esempio un campo di testo obbligatorio. Attenzione ai campi in cui 0 è valido, perché empty('0') è true.