注意 - 我对 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
就足够了,但要注意其后果。
如果$var
是0
、'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((。正如你已经发现的。我认为仅使用"空"可能会更快,但在内部可能会执行相同的检查。
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?
*/
}