是否为空()或使用isset()



注意 - 我对 empty((isset(( 非常了解,什么 我问的是使用它们的最合适/最有效的方式。

我刚刚在 php.net 参考下看到这句话empty()

如果变量不存在,则不会生成警告。这意味着 empty(( 本质上是 !isset($var( || $var 的简洁等价物 == 假

但同样,由于我现在主要在其他人的应用程序(独立项目、使用 cms 甚至框架的网站(上工作,我多次看到人们在写:

if (isset ($var) && $var != '')
// or
if (isset ($var) && !empty($var))

(主要使用 $_GET 和 $_POST 变量,但不仅如此(

据我了解,下面的代码段是等效的:

if (!empty($var))

还是我错过了什么?从技术上讲,用值检查变量是否存在的最佳方法是什么?

我知道这两个功能,它们的目的地。我只想知道是否需要empty()来检查是否设置了变量并给定值。我知道它有效,但它是否 100% 正确和安全?

isset($var) && !empty($var)生成的操作码

line     #  *  op                           fetch           ext  return  operands
---------------------------------------------------------------------------------

   3     0  >   EXT_STMT                                                 
         1      ISSET_ISEMPTY_VAR                      12800000    ~0       !0
         2  >   JMPZ_EX                                      ~0    ~0,     ->6
         3  >   ISSET_ISEMPTY_VAR                      11800000    ~1       !0
         4      BOOL_NOT                                     ~2    ~1
         5      BOOL                                         ~0    ~2
         6  >   FREE                                               ~0
   4     7  >   RETURN                                              1

和来自!empty($var)

line     #  *  op                           fetch           ext  return  operands
---------------------------------------------------------------------------------
   3     0  >   EXT_STMT                                                 
         1      ISSET_ISEMPTY_VAR                      11800000    ~0       !0
         2      BOOL_NOT                                           ~1       ~0
         3      FREE                                                        ~1
   4     4  >   RETURN                                                       1

所以是的,它确实重复ISSET_ISEMPTY_VAR但是!$empty .这取决于传递的值,但它不存在,顶级方式是少一个操作码BOOL_NOT.但如果它确实存在,底部的方式会更快。

尽管这不太可能成为任何应用程序的瓶颈

empty就足够了,但要注意其后果。

如果$var0'0'false''[]null之一(也许还有一些我忘记了(,那么它肯定会被认为是isset,但它也会empty。请注意,字符串'0'是一个特殊的陷阱。

我个人只使用isset.如果一个值需要是非empty的,那么我将单独检查并抛出一个错误(由合适的错误处理块捕获(,以给用户一个简单、精确的"这个值是必需的"错误。

isset只会告诉您变量是否已设置,而不考虑值(null,false等(。

如果要测试的值不是空字符串,null、false 或 0 使用 empty

如果你使用 !(empty($var( 然后设置变量并包含一个值,该值可以是空的,如 " 或 null 或 0。

if(!empty($_COOKIE['dev'])) echo 'developer mode';

如果 cookie 存在,要么是空的,要么是用任何值填充的,则条件为 true。否则,它将被忽略。

如果您使用数组并且不知道键是否设置为避免警告,这将非常有用。

> 当你评估 $_POST 和 $_GET 时,isset 和 isempty 之间的差异是有用的。正如您所说,不为空(( var 表示 isset AND 发送的值。

所以

if (!empty($var))

足够了

if (isset ($var) && $var != '')

你错过的只是有时

if (isset($var)) {
  if ($var != '') {
  } else {
    ... do "A"
  }
} else {
  ... do something different from "A"
}

你可能需要这个。如果这种情况经常发生,当它不会发生时,您只需合并两者 if 条件并忘记 empty((。正如你已经发现的。我认为仅使用"空"可能会更快,但在内部可能会执行相同的检查。

GET/

POST/COOKIE 变量应该用filter_input函数来检查。此函数可以检查输入(GET/POST/COOKIE/等(中是否存在指定的键,并选择性地对其进行过滤。例:

$id = filter_input(INPUT_GET, 'id', FILTER_VALIDATE_INT);
/*
 * QUERYSTRING           RESULT
 * ==================    ===============
 * test.php?             $id is NULL
 * test.php?id=          $id is FALSE
 * test.php?id=123abc    $id is FALSE
 * test.php?id=123       $id is int(123)
 */
if ($id !== NULL && $id !== FALSE) { /*...*/ }

另一方面,empty()函数只是检查变量是否未设置或其值是否为假值。此函数不能在错误值有意义的情况下使用:

if (empty($_GET["number_of_children"])) {
    /*
     * GET parameter is not set or its value is zero or falsy
     * Show an error? Or process the value?
     */
}
if (empty($_GET["number_of_children"]) === false) {
    /*
     * Definitely a truthy value
     * But how does one specify that he/she has no children?
     */
}

最新更新