isset () e empty () - o que usar

105

Você poderia me ajudar a melhorar meu estilo de codificação? :) Em algumas tarefas eu preciso verificar - a variável está vazia ou contém algo. Para resolver essa tarefa, geralmente faço o seguinte.

Verifique - esta variável está definida ou não? Se estiver definido - eu verifico - está vazio ou não?

<?php
    $var = '23';
    if (isset($var)&&!empty($var)){
        echo 'not empty';
    }else{
        echo 'is not set or empty';
    }
?>

E eu tenho uma pergunta - devo usar isset () antes de empty () - é necessário? TIA!

Dmitry Belaventsev
fonte
vazio é! isset ($ var) || $ var == false
zloctb
2
na minha opinião, empty () é um desenvolvimento horrível do PHP. Como ele considera "0" em qualquer formato como "vazio", você pode cair em armadilhas ruins que custam muito tempo de depuração. Eu diria: evite a todo custo e apenas escreva a lógica você mesmo
João

Respostas:

143

Depende do que você está procurando, se você está apenas olhando para ver se está vazio é só usar, emptypois ele verifica se está configurado também, se você quer saber se algo está configurado ou não, use isset.

Empty verifica se a variável está definida e se estiver, verifica se há nulo, "", 0, etc.

Isset apenas verifica se está definido, pode ser algo diferente de nulo

Com empty, os seguintes itens são considerados vazios:

  • "" (uma string vazia)
  • 0 (0 como um inteiro)
  • 0,0 (0 como flutuante)
  • "0" (0 como string)
  • NULO
  • FALSO
  • array () (um array vazio)
  • var $ var; (uma variável declarada, mas sem um valor em uma classe)

De http://php.net/manual/en/function.empty.php


Conforme mencionado nos comentários, a falta de aviso também é importante com o vazio ()

PHP Manual diz

empty () é o oposto de (boolean) var, exceto que nenhum aviso é gerado quando a variável não está definida .

Em relação ao isset

PHP Manual diz

isset () retornará FALSE se testar uma variável que foi definida como NULL


Seu código seria suficiente para:

<?php
    $var = '23';
    if (!empty($var)){
        echo 'not empty';
    }else{
        echo 'is not set or empty';
    }
?>

Por exemplo:

$var = "";

if(empty($var)) // true because "" is considered empty
 {...}
if(isset($var)) //true because var is set 
 {...}

if(empty($otherVar)) //true because $otherVar is null
 {...}
if(isset($otherVar)) //false because $otherVar is not set 
 {...}
Pez Cuckow
fonte
Isso significa - no código acima eu verifico se a variável está definida ou não duas vezes? :)
Dmitry Belaventsev
Apenas verifique se está vazio, o php não lançará um erro se este não for o caso.
Pez Cuckow
3
Você está omitindo o maior ponto de empty: Não lança um aviso quando a variável testada não existe. Esse é o objetivo dessa função, caso contrário, é idêntico a == false.
deceze
1
Portanto, o fato no manual de que "nenhum aviso é gerado quando a variável não está configurada" me confundiu. Nenhum aviso não significa que não terei problemas no código abaixo. Agora está claro para mim. Muito obrigado!
Dmitry Belaventsev
"isset apenas verifica se está definido, ainda pode ser nulo" Isso não é verdade: issetem uma variável nula (e existente) será avaliada como false.
netcoder
12

No seu caso particular: if ($var).

Você precisa usar issetse não souber se a variável existe ou não. Porém, como você o declarou na primeira linha, você sabe que ele existe, portanto, não precisa, não, não deve usar isset.

O mesmo vale para empty, só que emptytambém combina uma verificação da veracidade do valor. emptyé equivalente a !isset($var) || !$vare !emptyé equivalente a isset($var) && $var, ou isset($var) && $var == true.

Se você quiser apenas testar uma variável que deve existir para veracidade , if ($var)é perfeitamente adequado e direto ao ponto.

deceze
fonte
Este explica muito melhor. Se conseguirmos comparação para todos os outros casos como este !empty is equivalent to isset($var) && $var, seria incrível. Obrigado @deceze
Vir
6

Você pode apenas usar empty () - como visto na documentação , ele retornará falso se a variável não tiver valor.

Um exemplo nessa mesma página:

<?php
$var = 0;

// Evaluates to true because $var is empty
if (empty($var)) {
    echo '$var is either 0, empty, or not set at all';
}

// Evaluates as true because $var is set
if (isset($var)) {
    echo '$var is set even though it is empty';
}
?>

Você pode usar isset se quiser apenas saber se não é NULL. Caso contrário, parece que empty () pode ser usado sozinho.

chris
fonte
Explicação para o voto negativo? Ele não está perguntando se eles são iguais, ele está perguntando se ele precisa verificar isset antes de verificar vazio.
Chris
Eu não downvote, mas "uso isset se você quiser saber que não é nulo" não é correto: $var = null; isset( $var ) == true.
JJJ
Do Manual do PHP5 / 4: isset () - "Determine se uma variável está definida e não é NULL." us.php.net/manual/en/function.isset.php
chris
2

Aqui estão as saídas de isset()e empty()para as 4 possibilidades: não declarado, nulo, falso e verdadeiro.

$a=null;
$b=false;
$c=true;

var_dump(array(isset($z1),isset($a),isset($b),isset($c)),true); //$z1 previously undeclared
var_dump(array(empty($z2),empty($a),empty($b),empty($c)),true); //$z2 previously undeclared

//array(4) { [0]=> bool(false) [1]=> bool(false) [2]=> bool(true) [3]=> bool(true) } 
//array(4) { [0]=> bool(true) [1]=> bool(true) [2]=> bool(true) [3]=> bool(false) } 

Você notará que todos os resultados de 'isset' são opostos aos resultados 'vazios', exceto pelo caso $b=false. Todos os valores (exceto nulo que não é um valor, mas um não valor) avaliados como falso retornarão verdadeiro quando testado por issete falso quando testado por 'vazio'.

Portanto, use isset()quando estiver preocupado com a existência de uma variável. E use emptyquando estiver testando para verdadeiro ou falso. Se o tipo real de assuntos vazio, uso is_nulle ===0, ===false, ===''.

dnagirl
fonte
1

Vazio retorna verdadeiro se var não estiver definido. Mas isset retorna verdadeiro mesmo se var não estiver vazio.

Whiskas
fonte
-3
$var = 'abcdef';
if(isset($var))
{
   if (strlen($var) > 0);
   {
      //do something, string length greater than zero
   }
   else
   {
     //do something else, string length 0 or less
   }
}

Este é um exemplo simples. Espero que ajude.

editar: adicionado issetno caso de uma variável não ser definida como acima, causaria um erro, verificando se seu primeiro conjunto, pelo menos, ajudará a remover algumas dores de cabeça no caminho.

Akos
fonte
7
strlen abaixo de zero? Eu quero ver essa corda.
deceze
@deceze Apenas um exemplo aproximado :) OK use = 0 não <0
Akos