isset()和empty() - 该使用哪个?

114

你能帮我改进我的编码风格吗?:) 在一些任务中,我需要检查变量是否为空或包含内容。为了解决这个问题,我通常会执行以下步骤。

先检查变量是否被设置,如果已设置,则再检查它是否为空。

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

我有一个问题 - 我是否应该在使用empty()之前使用isset() - 这是必要的吗?TIA!


空值是!isset($var) || $var == false - zloctb
3
在我看来,empty() 是 PHP 的一个可怕的开发。因为它将任何形式的“0”都视为空值,你可能会陷入坏的陷阱中,浪费大量的调试时间。我建议:不惜一切代价避免使用它,自己编写逻辑。 - John
6个回答

158
这取决于您要查找什么,如果您只是想查看它是否为空,请使用empty,因为它会检查它是否被设置了,如果您想知道某个东西是否被设置,请使用issetempty检查变量是否被设置,如果被设置,则检查其是否为null、""、0等。
isset仅仅检查它是否被设置,它可以是任何非null的值。
使用empty时,以下内容将被视为空:
- ""(空字符串) - 0(作为整数的0) - 0.0(作为浮点数的0) - "0"(作为字符串的0) - NULL - FALSE - array()(一个空数组) - var $var;(在类中声明但不带任何值的变量)
摘自:http://php.net/manual/zh/function.empty.php 正如评论中提到的,empty()不生成警告信息也很重要。 PHP手册上说:
*empty()是(var)的反义词,除非未设置变量,否则不会生成警告。*
关于isset: PHP手册上说:
*如果测试已设置为NULL的变量,则isset()将返回FALSE。*
您的代码可以这样写:
<?php
    $var = '23';
    if (!empty($var)){
        echo 'not empty';
    }else{
        echo 'is not set or empty';
    }
?>
例如:
$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 
 {...}

这是什么意思 - 在上面的代码中,我检查变量是否设置了两次?:) - Dmitry Belaventsev
只需检查它是否为空,如果不是空的,PHP就不会抛出错误。 - Pez Cuckow
3
你漏掉了empty函数最重要的一点:当测试的变量不存在时,它不会抛出警告。这就是该函数的全部意义,否则它与==false完全相同。 - deceze
1
所以,手册中的“当变量未设置时不会生成警告”这一事实让我感到困惑。没有警告并不意味着我在下面的代码中不会遇到麻烦。现在我明白了。非常感谢! - Dmitry Belaventsev
"isset只是检查变量是否被设置,它仍然可能为空"这并不正确:对于一个空(但已存在)的变量使用isset将会评估为false。" - netcoder

14
在你这个特定的情况下: if ($var)
如果您不知道变量是否存在,那么需要使用isset。由于您在第一行声明了它,所以您知道它存在,因此您不需要也不应该使用issetempty 同样适用,只是empty还结合了对值的真实性的检查。empty等同于!isset($var) || !$var!empty等同于isset($var) && $varisset($var) && $var == true
如果您只想测试一个应该存在的变量的真实性if ($var)就足够了。

这个解释得更好。如果我们对所有其他情况进行比较,例如 !empty 等同于 isset($var) && $var,那就太棒了。谢谢 @deceze - G_real

7

您可以使用empty()函数 - 如文档中所示,如果变量没有值,则它将返回false。

同一页面上的示例:

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

如果您只想知道它是否不是NULL,则可以使用isset。否则,似乎单独使用empty()就足够了。


为什么要给他点踩?他不是在问它们是否相同,而是在问他是否需要在检查空之前检查isset。 - chris
我没有点踩,但是“如果想要知道它不为空,请使用isset”是不正确的:$var = null; isset($var) == true - JJJ
从PHP5/4手册中:isset() - "确定变量是否已设置且不为NULL。" http://us.php.net/manual/en/function.isset.php - chris

2
以下是未声明、null、false和true四种情况下isset()empty()的输出:
$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) } 

你会注意到所有的 'isset' 结果与 'empty' 结果是相反的,除了 case $b=false。 所有被评估为 false 的值(除了 null,它不是一个值而是一个非值)在使用 isset 进行测试时将返回 true,在使用 'empty' 进行测试时将返回 false。
因此,当你关心变量是否存在时,请使用 isset()。当你测试真或假时,请使用 empty。如果空值的实际类型很重要,请使用 is_null===0===false===''

1

如果变量未设置,empty返回true。但是isset即使变量不为空也会返回true。


这是一个有些误导且不完整的答案。 - mickmackusa

-4
$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
   }
}

这是一个简单的例子。希望它能有所帮助。

编辑:添加了isset,以防变量未像上面那样定义,这将导致错误,检查是否至少设置了第一个将有助于减少日后的一些麻烦。


8
strlen 小于 零?我想看看那个字符串。 - deceze
@deceze 只是一个粗略的例子 :) 好的使用 =0 而不是 <0 - Akos

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