为什么要检查isset()和!empty()

sil*_*low 254 php

有没有之间的差异isset!empty.如果我做这个双布尔检查,这种方式是正确的还是多余的?有没有更短的方法来做同样的事情?

isset($vars[1]) AND !empty($vars[1])
Run Code Online (Sandbox Code Playgroud)

dec*_*eze 402

这完全是多余的.empty或多或少是简写!isset($foo) || !$foo,并且!empty类似于isset($foo) && $foo.即empty做相反的事情isset加上额外的检查值的真实性.

或者换句话说,如果变量不存在,empty则相同!$foo,但不会发出警告.这是此函数的要点:进行布尔比较而不必担心设置的变量.

手册如下:

empty()与之相反(boolean) var,除了未设置变量时不会生成警告.

你可以!empty($vars[1])在这里使用.

  • @karim IMO` empty`是PHP中最容易被误解的函数之一.关于"没有警告产生"的小片很容易被忽视.我不得不自己扫描文档几次以发现它在这里发布. (7认同)
  • 但是如果没有`$ vars [1],他会得到通知. (6认同)
  • 我不知道从哪里得到这个想法.加一个. (6认同)
  • @Shahor*许多*语言将`0`视为`false`.PHP不是唯一的.仍然不确定你的投诉是什么. (4认同)
  • `empty($ vars [1])`不会引起任何警告,即使`$ vars [1]`没有设置,但`echo $ vars [1]`会.我用`echo $ vars [1]检查了这个事实; if(!empty($ vars [1]))echo 1; 否则回声0;`. (2认同)
  • @fred嗯,没有."isset和empty"("isset*但*empty")由`isset($ var)&&!$ var`覆盖.但是,如果您测试的值为"null",则此测试也会出现假阴性,因此不可靠,因此在实践中基本上不适用.你最后写的是"存在而不是空",只是"!空".我不确定究竟是什么"相反",所以这里有两个:"不存在并且是空的"→`!isset`(再次:假阴性),"不存在或是空"→"空". (2认同)
  • @fred 总是以逻辑长形式写出 `empty` !isset($var) || $var == false` 并且你会看到它在 `isset` 和 `empty` 的任何组合中*总是* 是多余的。 (2认同)
  • @Shahor**按预期工作*.PHP中的"0"是一个虚假的值是你必须要注意的,它不仅仅是"空"以这种方式对待它. (2认同)
  • `empty()`将*仍然*为嵌套变量发出警告.例如,这段代码会抛出一个警告:`empty($ unsetvar1 [$ unsetvar2 ['test']]);` (2认同)

Gre*_*att 31

isset() 测试变量是否设置且不为null:

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

empty() 当变量设置为某些值时,可以返回true:

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

要演示这一点,请尝试使用$ the_var unassigned,设置为0并设置为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";
}
?>
Run Code Online (Sandbox Code Playgroud)


Sno*_*ash 14

接受的答案是不正确的.

isset()等于!empty().

如果沿着这条路走下去,你会创建一些相当不愉快且难以调试的错误.例如,尝试运行此代码:

<?php

$s = '';

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

?>
Run Code Online (Sandbox Code Playgroud)

https://3v4l.org/J4nBb

  • 公认的答案绝不表明`isset` 等同于`!empty`。 (12认同)

raj*_*han 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';
}
Run Code Online (Sandbox Code Playgroud)


Jso*_*owa 6

isset($vars[1]) AND !empty($vars[1])相当于!empty($vars[1])

我准备了简单的代码来凭经验展示它。

最后一行是未定义的变量。

+-----------+---------+---------+----------+---------------------+
| 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               |
+-----------+---------+---------+----------+---------------------+
Run Code Online (Sandbox Code Playgroud)

和代码

$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");
Run Code Online (Sandbox Code Playgroud)

未定义的变量必须在函数外求值,因为函数本身在作用域内创建临时变量。