这两个语句的执行是否相同,$thing
可以是任何类型?
if (!empty($thing)) {
// do stuff
}
if ($thing) {
// do stuff
}
我知道我可以尝试一下,但我不确定我会抓住所有边缘情况......我担心在某些情况下它们会以相同的方式执行,但不是全部。
这两个语句的执行是否相同,$thing
可以是任何类型?
if (!empty($thing)) {
// do stuff
}
if ($thing) {
// do stuff
}
我知道我可以尝试一下,但我不确定我会抓住所有边缘情况......我担心在某些情况下它们会以相同的方式执行,但不是全部。
如果$thing
未定义,if ($thing)
则将抛出(非致命)错误,同时if (!empty($thing))
返回 false。
请参阅PHP 文档中的empty()。
if (empty($foo))
是 的负数,在类型比较表if ($foo)
中很容易看出,这意味着在最低级别:
if (!empty($foo))
在逻辑上与
if ($foo)
但是,对于未定义的变量或数组索引,if ($foo)
andif ($foo['bar'])
会导致 anE_WARNING
发生,whileif (!empty($foo))
和if (!empty($foo['bar']))
will不会。
为此,您应该更喜欢empty
and!empty
在变量或索引可能不存在的情况下,例如 with$_GET
或$_POST
。在变量或索引应该存在的情况下,您应该更喜欢$var
并且!$var
特别是跟踪引发的警告,因为它们可能是由于错误造成的。
根据手册有一些差异,例如:
$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 作为字符串)
- 空值
- 错误的
- array() (一个空数组)
- $var; (声明的变量,但没有值)
所以它们基本相同,但有一些非常细微的区别。谨慎使用两者,并尽可能进行类型检查。
在某些情况下,空可能会爆炸,其中最大的是0
价值
php > $x = 0;
php > var_dump(empty($x));
bool(true)
php > $x = false;
php > var_dump(empty($x));
bool(true);
只要您不需要 0/false 值通过,那么 empty() 效果很好。