是空的()还是使用isset()?

时间:2014-12-09 14:02:37

标签: php isset is-empty

  

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

我刚刚在empty()参考{/ 1}}下的php.net处看到了这句话

  

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

但同样,因为我现在主要在其他人的应用程序(独立项目,使用cms或甚至框架的网站)上工作,很多次我见过人们写作:

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

(主要使用$ _GET和$ _POST变量,但不仅仅是)

据我了解手册,下面的代码段相同:

if (!empty($var))

或者我错过了什么?技术上什么是检查变量存在的最佳方法?

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

6 个答案:

答案 0 :(得分:19)

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。但如果它确实存在,那么最底层的方式会更快。

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

答案 1 :(得分:14)

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

如果$var属于0'0'false''[]null(也许我遗忘的其他几个人,然后它肯定会被视为isset,但它也将是empty。请注意, string '0' 是一个特殊的问题。

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

答案 2 :(得分:4)

isset只会告诉您变量是否已设置,无论值是什么(null,false等)。

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

答案 3 :(得分:3)

如果使用!(空($ var),则设置变量并包含一个可以为空的值,如""或null或0。

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

如果cookie在那里,为空或填充任何值,则条件为真。 否则它将被忽略。

如果使用数组并且不知道密钥是否设置为避免警告,那么这很有用。

答案 4 :(得分:3)

当你评估$ _POST和$ _GET时,isset和isempty之间的差异是有用的。 正如你所说的那样,empty()var表示isset和值已发送。

所以

if (!empty($var))

足够

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

你有什么遗漏只是有时

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

  } else {
    ... do "A"
  }
} else {
  ... do something different from "A"
}
你可能需要这个。 如果这种情况经常发生,那么当它不会合并两个if条件并忘记empty()时。 你已经发现了。我认为使用“空”可能会更快但内部可能会进行相同的检查。

答案 5 :(得分:2)

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

$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()函数只检查变量是否未设置或其值是否为 falsy 。此函数不能用于虚假值有意义的情况:

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?
     */
}