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


269

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

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

3
这里有一张很好的图表,显示了将它们与不同类型的变量一起使用的结果(它们确实有所不同):virendrachandak.com/demos/php-isset-vs-empty-vs-is_null.php
Jeff Clayton

明显的精确补码是isset和is_null,但!empty涵盖了几个不同的补码。这完全取决于您要测试的数据类型。
杰夫·克莱顿

Answers:


419

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

换句话说,empty与相同!$foo,但是如果变量不存在,则不会发出警告。这就是该功能的重点:进行布尔比较,而不必担心设置变量。

手册说得像这样:

empty()与的相反(boolean) var只是未设置变量时不生成警告。

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


7
但是,如果没有,$vars[1]他会收到通知。
karim79 2010年

6
我不知道我从哪里得到这个想法。加一个。
karim79 2010年

8
@karim IMO empty是PHP中最容易被误解的函数之一。关于“不生成警告”的小片段非常容易被忽略。我不得不自己扫描文档几次,以将其发布到此处。
deceze

2
empty($vars[1])不会引起任何警告,即使$vars[1]未设置,但echo $vars[1]也会。我使用检查了事实echo $vars[1]; if (!empty($vars[1])) echo 1; else echo 0;
艾米尔·瓦杜瓦瓦拉

4
@Shahor 许多语言都将其0视为false。PHP不是唯一的一个。仍然不确定您的投诉是什么。
deceze

33

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";
}
?>

12

接受的答案不正确。

isset()等于!empty()。

如果沿着这条路线走,您将创建一些令人不快且难以调试的错误。例如,尝试运行以下代码:

<?php

$s = '';

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

?>

https://3v4l.org/J4nBb


7
公认的答案绝没有暗示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 2010年

3

如果只检查php doc(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上检查变量isset而不是null是否可以在php doc(isset)中找到


2

这不是必要的。

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

php.net


2
在任何PHP版本上都不需要这样做,因为empty已经检查了(不是)isset。您感到困惑的是,现在Empty支持带有问题的表达式。
alxgb

五年后,这是真的。
列侬

2

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

未定义的变量必须在函数外部求值,因为函数本身会在范围内创建临时变量。


0

“空”:仅适用于变量。空对于不同的变量类型可能意味着不同的事情(请查看手册:http : //php.net/manual/en/function.empty.php)。

“ isset”:检查变量是否存在,并检查真NULL或false值。可以通过调用“未设置”来取消设置。再次检查手册。

是否使用其中一个取决于您使用的变量类型。

我想说,检查这两者是比较安全的,因为首先要检查的是变量是否存在,以及它是否不是NULL或为空。


3
@szahn“更安全地检查两者”,-作为程序员,您可以检查所有想要的安全性。但是,如果您的代码是多余的,那么您作为程序员可以是多余的。
madlopt '16

0

如果我们使用同一页面通过“提交”按钮添加/编辑,如下所示

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

那么我们不应该使用

isset($_POST['edit_id'])

bcoz edit_id一直设置为添加页面还是编辑页面,我们应该在以下条件下使用check

!empty($_POST['edit_id'])

以前的帖子是bcoz提交的,我误按了enter键,这是我完整的答案...为什么要投票?:(
diEcho 2010年

0
  • 在PHP网站上,参考以下empty()函数:

返回FALSE如果var有一个非空和非零值。

知道是一件好事。换句话说,使用该功能时,从NULL0到“”的所有内容都会返回。TRUEempty()

  • 这是isset()函数返回内容的描述:

返回TRUE是否var存在;FALSE除此以外。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.