这两个语句是否完全相同,给定$thing
可以是任何类型的?
if (!empty($thing)) {
// do stuff
}
if ($thing) {
// do stuff
}
我知道我可以尝试一下,但我不确定我是否能抓住所有边缘情况......我担心在某些情况下他们会执行相同的操作,但是不是全部。
答案 0 :(得分:4)
如果$thing
未定义,则if ($thing)
会抛出(非致命)错误,而if (!empty($thing))
将返回false。
请参阅PHP文档中的empty()。
答案 1 :(得分:2)
if (empty($foo))
是if ($foo)
的否定,可以很容易地在type comparison tables中看到,这意味着在最低级别:
if (!empty($foo))
在逻辑上与
相同if ($foo)
然而,对于未定义的变量或数组索引,if ($foo)
和if ($foo['bar'])
会导致E_WARNING
发生,而if (!empty($foo))
和{ {1}} 不。
为此,如果变量或索引可能不存在,您应该更喜欢if (!empty($foo['bar']))
和empty
,例如使用!empty
或$_GET
。如果变量或索引应该存在,您应该特别选择$_POST
和$var
,以便跟踪抛出的警告,因为它们可能是由于错误造成的。 / p>
答案 2 :(得分:2)
相关的手册页为Converting to boolean,当然还有empty()。对于empty()
,我们有:
如果变量不存在或者其值等于
,则该变量被视为空FALSE
因此,除非在变量不存在的情况下,它们完全等效。在那种情况下:
var_dump( empty($not_exists), (bool)$not_exists );
......我们得到:
bool(true)
bool(false)
...(在相应的notice
中)因为:
以下值被视为
FALSE
:[...]未设置变量
答案 3 :(得分:0)
根据手册有一些差异,例如:
$object = new stdclass;
if ($object) {} // false in PHP 4, true in PHP 5+
此外,您只能将变量传递给empty
,这会引发错误:
if (empty(time()) {}
// Fatal error: Can't use function return value in write context
if (time()) {} // OK
当然,对未初始化的变量if ($var)
会产生通知。
if ($var)
是一个隐式的布尔转换。有关详细信息,请参阅手册。
http://php.net/manual/en/language.types.boolean.php
转换为布尔值时,以下值被视为FALSE:
- 布尔值FALSE本身
- 整数0(零)
- 浮点数0.0(零)
- 空字符串,字符串“0”
- 包含零元素的数组
- 一个零成员变量的对象(仅限PHP 4)
- 特殊类型NULL(包括未设置的变量)
- 从空标签创建的SimpleXML对象
其他每个值都被视为TRUE(包括任何资源)。
与empty
http://php.net/manual/en/function.empty.php
以下内容被认为是空的:
- “”(空字符串)
- 0(0为整数)
- 0.0(0作为浮动)
- “0”(0作为字符串)
- NULL
- FALSE
- array()(空数组)
- $变种; (声明的变量,但没有值)
所以它们基本相同,但有一些非常微妙的差异。请谨慎使用,并在可能的情况下进行类型检查。
答案 4 :(得分:0)
0
值
php > $x = 0;
php > var_dump(empty($x));
bool(true)
php > $x = false;
php > var_dump(empty($x));
bool(true);
只要你不要求0 / false值通过,那么empty()效果很好。