5

这两个语句的执行是否相同,$thing可以是任何类型?

if (!empty($thing)) {
    // do stuff
}

if ($thing) {
    // do stuff
}

我知道我可以尝试一下,但我不确定我会抓住所有边缘情况......我担心在某些情况下它们会以相同的方式执行,但不是全部。

4

5 回答 5

4

如果$thing未定义,if ($thing)则将抛出(非致命)错误,同时if (!empty($thing))返回 false。

请参阅PHP 文档中的empty()

于 2012-11-21T16:55:46.050 回答
2

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不会

为此,您应该更喜欢emptyand!empty在变量或索引可能不存在的情况下,例如 with$_GET$_POST。在变量或索引应该存在的情况下,您应该更喜欢$var并且!$var特别是跟踪引发的警告,因为它们可能是由于错误造成的。

于 2012-11-21T17:02:29.800 回答
2

相关手册页正在转换为布尔值,当然还有empty()。因为empty()我们有这个:

如果一个变量不存在或者它的值等于FALSE

所以它们是完全等价的,除非在变量不存在的情况下。在这种情况下:

var_dump( empty($not_exists), (bool)$not_exists );

...我们得到:

bool(true)
bool(false)

...(在相应的 中notice)因为:

考虑以下值FALSE: [...] 未设置的变量

于 2012-11-21T17:04:19.263 回答
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 作为字符串)
  • 空值
  • 错误的
  • array() (一个空数组)
  • $var; (声明的变量,但没有值)

所以它们基本相同,但有一些非常细微的区别。谨慎使用两者,并尽可能进行类型检查。

于 2012-11-21T17:11:03.060 回答
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() 效果很好。

于 2012-11-21T17:11:13.403 回答