注意 - 我非常了解 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%正确且安全?
答案 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?
*/
}