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

For*_*ien 23 php isset is-empty

注意 - 我几乎都知道empty()isset(),我要问的是使用它们的最合适/最有效的方法.

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

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

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

if (isset ($var) && $var != '')
// or
if (isset ($var) && !empty($var))
Run Code Online (Sandbox Code Playgroud)

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

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

if (!empty($var))
Run Code Online (Sandbox Code Playgroud)

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

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

exu*_*sum 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
Run Code Online (Sandbox Code Playgroud)

!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
Run Code Online (Sandbox Code Playgroud)

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

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


Nie*_*sol 14

empty 是足够的,但要注意其后果.

如果$var是一0,'0',false,'',[],null(也许还有其他一些我忘了),那么它将被视为isset肯定,但它也将是empty.请注意,字符串'0'是一个特殊的问题.

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