Por que verificar isset () e! Empty ()

269

Existe uma diferença entre issete !empty. Se eu fizer essa verificação booleana dupla, ela está correta ou é redundante? e existe uma maneira mais curta de fazer a mesma coisa?

isset($vars[1]) AND !empty($vars[1])
silow
fonte
3
Há um bom gráfico sobre os resultados de usá-los com diferentes tipos de variáveis ​​(eles têm diferenças) aqui: virendrachandak.com/demos/php-isset-vs-empty-vs-is_null.php
Jeff Clayton
Os complementos exatos óbvios são isset e is_null, mas! Empty cobre alguns diferentes. Tudo depende do tipo de dados que você está testando.
Jeff Clayton

Respostas:

420

Isso é completamente redundante. emptyé mais ou menos uma abreviação para !isset($foo) || !$foo, e !emptyé análogo a isset($foo) && $foo. Ou seja, emptyfaz o inverso de issetmais uma verificação adicional da veracidade de um valor.

Ou, em outras palavras, emptyé o mesmo que !$foo, mas não lança avisos se a variável não existir. Esse é o ponto principal dessa função: faça uma comparação booleana sem se preocupar com a variável que está sendo configurada.

O manual coloca assim:

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

Você pode simplesmente usar !empty($vars[1])aqui.

deceze
fonte
7
Mas se não houver, $vars[1]ele receberá um aviso.
karim79
6
Não faço ideia de onde tirei essa ideia. Mais um.
karim79
8
O @karim IMO emptyé uma das funções mais incompreendidas do PHP. O pequeno trecho sobre "nenhum aviso é gerado" é muito fácil de ignorar. Eu tive que digitalizar a documentação algumas vezes para identificá-la aqui.
deceze
2
empty($vars[1])não causa nenhum aviso que nem $vars[1]esteja definido, mas echo $vars[1]causará. Eu verifiquei o fato usando echo $vars[1]; if (!empty($vars[1])) echo 1; else echo 0;.
Amil Waduwawara
4
@Shahor Muitas línguas consideram 0como false. PHP não é o único. Ainda não tenho certeza de qual é a sua reclamação.
deceze
33

isset() testa se uma variável está definida e não é nula:

http://us.php.net/manual/en/function.isset.php

empty() pode retornar true quando a variável estiver configurada para determinados valores:

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

Para demonstrar isso, tente o seguinte código com $ the_var não atribuído, defina como 0 e defina 1.

<?php

#$the_var = 0;

if (isset($the_var)) {
  echo "set";
} else {
  echo "not set";
}

echo "\n";

if (empty($the_var)) {
  echo "empty";
} else {
  echo "not empty";
}
?>
GreenMatt
fonte
12

A resposta aceita não está correta.

isset () NÃO é equivalente a! empty ().

Você criará alguns erros bastante desagradáveis ​​e difíceis de depurar se seguir esta rota. por exemplo, tente executar este código:

<?php

$s = '';

print "isset: '" . isset($s) . "'. ";
print "!empty: '" . !empty($s) . "'";

?>

https://3v4l.org/J4nBb

Snowcrash
fonte
7
A resposta aceita de forma alguma sugere que isso isseté equivalente a !empty.
deceze
8
$a = 0;
if (isset($a)) { //$a is set because it has some value ,eg:0
    echo '$a has value';
}
if (!empty($a)) { //$a is empty because it has value 0
    echo '$a is not empty';
} else {
    echo '$a is empty';
}
rajmohan
fonte
1
Mas você não lidou com variáveis ​​não definidas.
Amil Waduwawara
3

Empty just check é a variável / matriz referenciada tem um valor se você verificar o php doc (vazio), verá que isso é considerado vazio

* "" (an empty string)
* 0 (0 as an integer)
* "0" (0 as a string)
* NULL
* FALSE
* array() (an empty array)
* var $var; (a variable declared, but without a value in a class)

while isset verifique se a variável isset e não nula também podem ser encontradas no php doc (isset)

Breezer
fonte
2

Não é necessário.

Nenhum aviso será gerado se a variável não existir. Isso significa que empty () é essencialmente o equivalente conciso a! Isset ($ var) || $ var == false.

php.net

madlopt
fonte
2
Isso nunca foi necessário em nenhuma versão do PHP, pois o vazio já verifica (não) o isset. Você está confundindo o fato de que vazio agora suporta expressões com a pergunta.
Alxgb
Isso é verdade, cinco anos depois.
Lennon
2

isset($vars[1]) AND !empty($vars[1])é equivalente a !empty($vars[1]).

Eu preparei um código simples para mostrá-lo empiricamente.

A última linha é variável indefinida.

+-----------+---------+---------+----------+---------------------+
| Var value | empty() | isset() | !empty() | isset() && !empty() |
+-----------+---------+---------+----------+---------------------+
| ''        | true    | true    | false    | false               |
| ' '       | false   | true    | true     | true                |
| false     | true    | true    | false    | false               |
| true      | false   | true    | true     | true                |
| array ()  | true    | true    | false    | false               |
| NULL      | true    | false   | false    | false               |
| '0'       | true    | true    | false    | false               |
| 0         | true    | true    | false    | false               |
| 0.0       | true    | true    | false    | false               |
| undefined | true    | false   | false    | false               |
+-----------+---------+---------+----------+---------------------+

E código

$var1 = "";
$var2 = " ";
$var3 = FALSE;
$var4 = TRUE;
$var5 = array();
$var6 = null;
$var7 = "0";
$var8 = 0;
$var9 = 0.0;

function compare($var)
{
    print(var_export($var, true) . "|" .
        var_export(empty($var), true) . "|" .
        var_export(isset($var), true) . "|" .
        var_export(!empty($var), true) . "|" .
        var_export(isset($var) && !empty($var), true) . "\n");
}

for ($i = 1; $i <= 9; $i++) {
    $var = 'var' . $i;
    compare($$var);
}

@print(var_export($var10, true) . "|" .
    var_export(empty($var10), true) . "|" .
    var_export(isset($var10), true) . "|" .
    var_export(!empty($var10), true) . "|" .
    var_export(isset($var10) && !empty($var10), true) . "\n");

A variável indefinida deve ser avaliada fora da função, porque a própria função cria uma variável temporária no próprio escopo.

Tajni
fonte
0

"Vazio": funciona apenas em variáveis. Vazio pode significar coisas diferentes para diferentes tipos de variáveis ​​(consulte o manual: http://php.net/manual/en/function.empty.php ).

"isset": verifica se a variável existe e verifica se há um valor NULL ou falso verdadeiro. Pode ser desabilitado chamando "desabilitado". Mais uma vez, verifique o manual.

O uso de qualquer um deles depende do tipo de variável que você está usando.

Eu diria que é mais seguro verificar os dois, porque você está verificando primeiro se a variável existe e se ela não é realmente NULL ou vazia.

Stuart
fonte
3
@szahn "mais seguro para verificar os dois", - você como programador pode verificar tudo o que deseja quanto à segurança. Mas se seu código for redundante, você poderá ser redundante como programador.
precisa
0

se usarmos a mesma página para adicionar / editar via botão enviar, como abaixo

<input type="hidden" value="<?echo $_GET['edit_id'];?>" name="edit_id">

então não devemos usar

isset($_POST['edit_id'])

bcoz edit_idé definido o tempo todo, seja na página de adição ou edição, em vez disso, devemos usar a verificação abaixo da condição

!empty($_POST['edit_id'])
diEcho
fonte
post anterior foi enviado bcoz eu pressione enter por engano, aqui está a minha resposta completa ... por que reduzir o voto? :(
diEcho
0
  • No site PHP, referindo-se à empty()função:

Retorna FALSEse vartiver um valor não vazio e diferente de zero.

Isso é uma coisa boa de saber. Em outras palavras, tudo, de NULL, 0a "" retornará TRUEao usar a empty()função.

  • Aqui está a descrição do que a isset()função retorna:

Retorna TRUEse varexistir; FALSEde outra forma.

Em outras palavras, apenas variáveis ​​que não existem (ou variáveis ​​com NULLvalores estritamente ) retornarão FALSEà isset()função. Todas as variáveis ​​que possuem qualquer tipo de valor, seja 0uma sequência de texto em branco, etc. serão retornadas TRUE.

Ende
fonte