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

298

isset!empty之间有什么区别。如果我进行这个双布尔检查,这样做是正确的还是多余的?有没有更短的方法来做同样的事情?

isset($vars[1]) AND !empty($vars[1])

3
这里有一张漂亮的图表,展示了在使用不同类型变量时它们之间的区别(它们确实有差异):https://www.virendrachandak.com/demos/php-isset-vs-empty-vs-is_null.php - Jeff Clayton
显而易见的确切补充是isset和is_null,但!empty涵盖了一些不同的内容。这完全取决于您要测试的数据类型。 - Jeff Clayton
10个回答

462

这是完全冗余的。 empty 或多或少就是 !isset($foo) || !$foo 的简写,而 !empty 相当于 isset($foo) && $foo。也就是说,empty 做的是和 isset 相反的事情,并且额外检查一个值的真实性。

换句话说,empty!$foo 是一样的,但如果变量不存在,它不会抛出警告。这个函数的主要目的是进行布尔比较,而不必担心变量是否设置。

手册 这样描述:

empty()(boolean) var 的相反,除了当变量未设置时不会生成警告。

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


13
但是如果没有$vars[1],他会收到一条通知。 - karim79
7
我不知道我从哪里得到那个想法。加一。 - karim79
10
在我看来,“empty”是PHP中最容易被误解的函数之一。关于“不会生成警告”的简短片段很容易被忽视。我不得不自己多次扫描文档才能找到它并在此处发布。 - deceze
3
@Shahor 这正是预期的效果。在 PHP 中,0 是一个假值,这是你必须注意的,不仅仅是 empty 函数会这样处理。 - deceze
5
许多语言将 0 视为 false。PHP 并不是唯一的这样做的语言。我仍然不确定你的抱怨是什么。 - deceze
显示剩余24条评论

35

isset()函数用于测试变量是否已设置并且不为null:

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

empty()函数在变量被设置为某些值时可能返回true:

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

为了证明这一点,请尝试使用未分配的$the_var,设置为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";
}
?>

19

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               |
+-----------+---------+---------+----------+---------------------+

和代码

$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");

未定义的变量必须在函数外部进行评估,因为函数本身会在其作用域中创建临时变量。


13

isset() 不等同于 !empty()。

如果你选择这条路线,你将会遇到一些非常不愉快且难以调试的错误。例如,尝试运行以下代码:

<?php

$s = '';

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

?>

https://3v4l.org/J4nBb


18
接受答案绝不意味着 isset 等同于 !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';
}

1
但是你还没有处理变量未设置的情况。 - Amil Waduwawara

3

Empty函数仅检查所引用的变量/数组是否具有值。如果您查看php文档(empty),您会发现这些内容被视为空。

* "" (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)

通过使用isset,可以检查变量是否设置且不为null,更多信息请参考PHP文档(isset)


2

这并不是必须的。

如果变量不存在,将不会生成任何警告。这意味着empty()本质上等同于!isset($var) || $var == false。

php.net


2
这在任何 PHP 版本中都不是必需的,因为 empty 已经检查了(未)isset。你混淆了 empty 现在支持表达式的事实和疑问符。 - alxgb
五年后才能知道真相。 - Lennon

1
  • 来自 PHP 网站,有关 empty() 函数的说明:

如果 var 有非空且非零值,则返回 FALSE

这是一个很好的知识点。换句话说,无论是从 NULL0 再到“”,在使用 empty() 函数时都将返回 TRUE

  • 下面是 isset() 函数返回值的描述:

如果 var 存在,则返回 TRUE;否则返回 FALSE

换句话说,只有不存在的变量(或具有严格的 NULL 值的变量)才会在 isset() 函数上返回 FALSE。所有具有任何类型值的变量,无论是 0、空文本字符串等,都将返回 TRUE


0

“Empty”:只适用于变量。对于不同类型的变量,“空”可以有不同的含义(请查阅手册:http://php.net/manual/en/function.empty.php)。

“isset”:检查变量是否存在,并检查其为真NULL或假值。可以通过调用“unset”来取消设置。再次提醒,查看手册。

使用其中任意一种取决于您正在使用的变量类型。

我认为最安全的做法是同时检查两者,因为您首先要检查变量是否存在,如果它确实不为NULL或为空。


3
“更安全的做法是检查两者”,作为程序员,您可以对安全性进行想要的所有检查。但如果您的代码过于冗余,那么作为程序员也会变得冗余。 - madlopt

-1
如果我们使用同一页来通过提交按钮进行添加/编辑,如下所示
<input type="hidden" value="<?echo $_GET['edit_id'];?>" name="edit_id">

那么我们就不应该使用

isset($_POST['edit_id'])

因为无论是添加页面还是编辑页面,edit_id 都会被设置,所以我们应该使用以下条件检查。
!empty($_POST['edit_id'])

上一个帖子是因为我不小心按了回车键提交了,这是我的完整回答...为什么要踩我?:( - xkeshav

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接