isset($var) retorna true se a variável existe e o valor dela não é null. Ele retorna false para uma variável indefinida, removida com unset ou que guarda null, e nunca imprime aviso.
isset() só olha se algo está lá. Um valor definido mas vazio, como 0, "" ou [], ainda retorna true. Se você quer "definido e não vazio", use empty (negado).
Verificar se uma chave de array existe com isset
É aqui que o isset() é mais usado. Ler uma chave que não existe imprime Warning: Undefined array key numa configuração normal do PHP; verificar antes com isset() não imprime. Também funciona com chaves aninhadas e para em silêncio no primeiro nível ausente.
Quando você só precisa do valor ou de um padrão, $user["website"] ?? "none" faz a mesma verificação num passo. Veja o operador de coalescência nula.
isset com várias variáveis
Passe vários argumentos e o isset() retorna true só se todos estiverem definidos e não forem null. É um jeito curto de verificar que todos os campos obrigatórios chegaram.
isset em strings e objetos
Numa string, isset($str[5]) verifica se existe um caractere no offset 5, o que é uma verificação rápida de tamanho. Num objeto, verifica uma propriedade; para uma classe com dados privados, o isset() chama o método __isset() se a classe o definir.
isset, empty e is_null
Escolha um valor de $x na tabela para comparar as três verificações e o cast (bool) simples. Cada célula foi calculada pelo PHP 8.3.
| $x | isset | empty | is_null | bool |
|---|---|---|---|---|
| null | ||||
| false | ||||
| 0 | ||||
| "0" | ||||
| "" | ||||
| " " | ||||
| [] | ||||
| "a" | ||||
| 1 | ||||
| 0.0 | ||||
| "0.0" |
O padrão para lembrar:
isset()éfalsesó paranulle para coisas que não existem.empty()étruepara esses casos e também para todo valor falso:false,0,0.0,"","0",[].is_null()dá o oposto deisset()para variáveis existentes, mas avisa quando a variável é indefinida. Useisset()ou=== nullno lugar.
Verificar se um formulário foi enviado
isset() é o jeito clássico de ver se um campo do formulário chegou. Rode este bloco, digite um nome e clique em Send: o mesmo script roda de novo com $_POST preenchido.
Um campo de texto vazio ainda é enviado, como "", então isset($_POST["name"]) é true depois de qualquer envio. Um checkbox desmarcado não é enviado, o que torna o isset() exatamente o teste certo para checkboxes. Para exigir um valor não vazio, verifique a string com trim como o bloco faz. A página sobre formulários monta um formulário completo com validação.
isset ou array_key_exists
Os dois concordam em tudo, exceto numa chave cujo valor é null. isset() a trata como ausente, array_key_exists() não.
Se "definido como null" significa algo diferente de "não configurado" nos seus dados, use array_key_exists(). Caso contrário, isset() é mais curto e, por ser uma construção da linguagem e não uma chamada de função, também é um pouco mais rápido.
Erro comum: isset numa expressão
isset() só aceita variáveis, elementos de array e propriedades. Passar o resultado de uma função ou uma constante é um erro de compilação:
<?php
if (isset(trim($input))) {}
PHP Fatal error: Cannot use isset() on the result of an expression (you can use "null !== expression" instead) in /home/index.php on line 2
Guarde o resultado numa variável antes, ou teste o próprio valor: null !== $expr, como a mensagem sugere, ou trim($input) !== "" para uma string.
Perguntas frequentes
O que faz o isset() no PHP?
isset($x) retorna true se $x existe e não é null, e false caso contrário. Ele nunca gera aviso para uma variável ou chave de array indefinida, então é seguro com dados da requisição como isset($_POST['email']).
Qual a diferença entre isset() e empty() no PHP?
isset() pergunta "isto existe e não é null"; empty() pergunta "isto está ausente ou é falso". Para 0, "", "0" e [], isset() retorna true e empty() também retorna true. Para null ou uma chave ausente, isset() é false e empty() é true. !empty($x) é o mesmo que isset($x) && $x ser verdadeiro.
isset() pode verificar várias variáveis?
Sim: isset($a, $b, $c) retorna true só se todas estiverem definidas e não forem null. Ele para na primeira que não está definida.
Devo usar isset() ou array_key_exists()?
Eles só diferem quando a chave existe com o valor null: isset($arr['k']) retorna false, array_key_exists('k', $arr) retorna true. Use array_key_exists quando null for um valor guardado com significado; caso contrário, isset é mais curto e um pouco mais rápido.