是 empty() 足够了还是使用 isset()?

2022-08-30 18:22:37

注意 - 我对 empty()isset() 了解很多,我问的是使用它们的最正确/最有效的方法。

我刚刚在 php.net 看到这句话被引用:empty()

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

但同样,由于我现在主要在其他人的应用程序(无论是独立项目,使用CMS的网站还是框架)上工作,我多次看到人们写:

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

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

据我所知,手册,下面的片段是等效的:

if (!empty($var))

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

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


答案 1

操作码生成自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$emptyBOOL_NOT

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


答案 2

empty就足够了,但要小心它的后果。

如果 是 、 、 、 、 、 ( 也许还有我忘记的其他几个)之一,那么它肯定会被考虑,但它也会被考虑。请注意,字符串“0”是一个特定的问题。$var0'0'false''[]nullissetempty

我个人只使用.如果要求某个值为 non-,我将单独检查该值并引发错误(由合适的错误处理块捕获),以为用户提供简单,精确的“此值是必需的”错误。issetempty


推荐