empty($var) retorna true se a variável não existe ou se o valor dela é falso: null, false, 0, 0.0, "", "0" ou um array vazio []. Para qualquer outro valor, retorna false. Como o isset(), ele nunca avisa sobre variáveis ou chaves de array indefinidas.
empty($x) é o mesmo que !isset($x) || !$x. Em outras palavras: ausente, ou vira false.
Quais valores são vazios
Escolha um valor na tabela para ver empty() ao lado de isset() e do cast (bool). Cada célula foi calculada pelo PHP 8.3.
| $x | empty | isset | bool |
|---|---|---|---|
| null | |||
| false | |||
| 0 | |||
| 0.0 | |||
| "" | |||
| "0" | |||
| [] | |||
| " " | |||
| "0.0" | |||
| "a" | |||
| "null" | |||
| [0] | |||
| 1 | |||
| -1 |
As surpresas estão nas duas pontas: "0" é vazio, enquanto " " (um espaço), "0.0", "null" e [0] não são.
"0" é vazio: o bug clássico
Como "0" é falso, o empty() trata uma quantidade 0, uma pontuação 0 ou um PIN "0" como "nada digitado". Isso pega em formulários, onde todo valor chega como string.
Para entrada de texto, a verificação confiável de "nada digitado" é trim($value) === "". Deixe o empty() para valores em que 0 realmente significa nada.
Verificar se uma string está vazia
Para testar uma string vazia com exatidão, compare com "". Para também tratar espaços em branco como vazio, aplique trim antes. Desde o PHP 5.5, o empty() aceita expressões, então empty(trim($s)) também funciona (mas tem o mesmo problema do "0").
trim() não aceita null sem um aviso de depreciação no PHP 8.1 e posteriores, e é por isso que o bloco escreve trim($s ?? "").
Verificar se um array está vazio
Para arrays, empty($arr), $arr === [] e count($arr) === 0 dão a mesma resposta. O empty() tem a vantagem de funcionar numa variável ou chave que talvez não exista.
array_filter() sem callback remove todos os valores falsos, então é um jeito rápido de perguntar "este array tem algo de verdade".
Validar um campo obrigatório do formulário
!empty() é um jeito comum de exigir um campo, desde que 0 não seja uma resposta válida. Rode este bloco, deixe os campos em branco e clique em Send, depois preencha e envie de novo: o script roda mais uma vez com $_POST preenchido.
empty($_POST["terms"]) cobre os dois casos do checkbox: não enviado, ou enviado com valor vazio. A página sobre formulários vai além, com mensagens de erro por campo.
empty ou isset
Os dois são seguros com variáveis e chaves indefinidas. Eles respondem perguntas diferentes:
isset($x): existe e não énull? Use para chaves opcionais, checkboxes e "isto foi enviado".!empty($x): existe e é verdadeiro? Use para "tem algo de verdade", quando0e"0"não contam.$x === ""ou$x === []: está exatamente vazio? Use quando0é um valor válido.
A página sobre isset cobre a outra metade, incluindo isset() com várias variáveis de uma vez e a diferença para array_key_exists().
Perguntas frequentes
Quais valores o empty() considera vazios no PHP?
empty($x) é true quando $x não existe ou é null, false, 0, 0.0, "", "0" ou []. Todo o resto não é vazio, incluindo " " (um espaço), "0.0", "false" e [0].
Por que "0" é vazio no PHP?
empty() é o mesmo que !$x sem o aviso para variáveis indefinidas, e a string "0" vira false. Isso torna o empty() errado para campos em que 0 é uma resposta válida; verifique $x === '' ou trim($x) === '' no lugar.
Como verifico se um array está vazio no PHP?
empty($arr) e $arr === [] funcionam, e count($arr) === 0 também. empty() também retorna true quando a variável não está definida, enquanto count() numa variável indefinida avisaria e depois lançaria um TypeError para null.
Quando devo usar empty() em vez de isset()?
Use isset() quando você só precisa saber que um valor existe (um checkbox foi enviado, uma chave de configuração está presente). Use !empty() quando o valor também não pode estar em branco, por exemplo um campo de texto obrigatório. Cuidado com campos em que 0 é válido, já que empty('0') é true.