【问题标题】:Why check both isset() and !empty()为什么要同时检查 isset() 和 !empty()
【发布时间】:2011-06-01 09:20:25
【问题描述】:

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

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

【问题讨论】:

  • 这里有一张很好的图表,显示了将它们与不同类型的变量一起使用的结果(它们确实存在差异):virendrachandak.com/demos/php-isset-vs-empty-vs-is_null.php
  • 明显的精确补码是 isset 和 is_null,但 !empty 涵盖了几个不同的补码。这完全取决于您要测试的数据类型。

标签: php


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:
    • 来自PHP网站,参考empty()函数:

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

    这是一件好事。换句话说,在使用empty() 函数时,从NULL0 再到“”的所有内容都将返回TRUE

    • 以下是isset() 函数返回内容的说明:

    如果存在var,则返回TRUEFALSE 否则。

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

    【讨论】:

      【解决方案3】:

      接受的答案不正确。

      isset() 等同于 !empty()。

      如果你走这条路,你会产生一些相当不愉快且难以调试的错误。例如尝试运行此代码:

      <?php
      
      $s = '';
      
      print "isset: '" . isset($s) . "'. ";
      print "!empty: '" . !empty($s) . "'";
      
      ?>
      

      https://3v4l.org/J4nBb

      【讨论】:

      • 接受的答案绝不表明isset 等同于!empty
      【解决方案4】:

      没必要。

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

      php.net

      【讨论】:

      • 这在任何 PHP 版本上都不是必需的,因为 empty 已经检查(不是)isset。您混淆了 empty 现在支持带有问题的表达式这一事实。
      • 五年后才是真的。
      【解决方案5】:
      $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';
      }
      

      【讨论】:

      • 但是你还没有处理变量未设置大小写。
      【解决方案6】:

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

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

      empty() 可以在变量设置为特定值时返回 true:

      http://us.php.net/manual/en/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";
      }
      ?>
      

      【讨论】:

        【解决方案7】:

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

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

        The manual 是这样说的:

        empty()(boolean) var相反,除了不设置变量时不产生警告。

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

        【讨论】:

        • 但是如果没有$vars[1] 他会收到通知。
        • 我不知道我从哪里得到这个想法。加一个。
        • @karim IMO empty 是 PHP 中最容易被误解的函数之一。关于“不生成警告”的微小 sn-p 很容易被忽略。我不得不自己扫描文档几次才能发现它并在这里发布。
        • @fred Uhm,不。 isset($var) &amp;&amp; !$var 涵盖了“isset and empty”(“isset but empty”)。但是,如果您正在测试值null,此测试也有误报,因此不可靠,因此在实践中基本上不适用。你最后写的“存在且不为空”,就是!empty。我不确定“相反”到底是什么,所以这里有两个:“不存在并且为空”→!isset(再次:假阴性),“不存在或为空”→empty
        • @Shahor 许多 语言将0 视为false。 PHP 不是唯一的。仍然不确定您的投诉是什么。
        【解决方案8】:

        如果我们使用相同的页面通过如下提交按钮添加/编辑

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

        那么我们不应该使用

        isset($_POST['edit_id'])
        

        bcozedit_id无论是添加还是编辑页面都一直设置,而不是我们应该使用检查以下条件

        !empty($_POST['edit_id'])
        

        【讨论】:

        • 之前的帖子已提交,因为我按错误输入,这是我的完整答案...为什么要投反对票? :(
        【解决方案9】:

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

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

        使用任一变量取决于您使用的变量类型。

        我想说,同时检查两者会更安全,因为您首先要检查变量是否存在,以及它是否真的不是 NULL 或空。

        【讨论】:

        • @szahn “更安全地检查两者”, - 作为程序员,您可以检查所有您想要的安全性。但是如果你的代码是多余的,那么你作为程序员可能是多余的。
        【解决方案10】:

        如果你检查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)
        

        while isset 检查变量 isset 是否为 null,也可以在 php doc(isset) 中找到

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-11-03
          • 1970-01-01
          • 1970-01-01
          • 2014-01-02
          • 1970-01-01
          • 2010-12-29
          相关资源
          最近更新 更多