PHP 如果 null 或 false 默认返回空数组?



为什么这行代码在 php 中不像在 JS 中那样工作:

$id = [];
$id = null || [];
if (count($id)) {
echo 'd';
}

为什么$id仍然是空数组[]?因此,count()给出错误。

在 PHP 中,像||这样的逻辑运算符总是返回布尔值,即使给定了一个非布尔输出。

所以你的陈述被评估为"null[]真实?由于null和空数组的计算结果均为 false,因此结果是布尔false

然而,有两个运算符可以做类似于JS||的操作:

  • $a ?: $b$a ? $a : $b的简写;换句话说,它计算$a它是否是"真实的",或者如果不是,则$b(这与三元运算符一起记录下来,它是一个简写的)。
  • $a ?? $b类似,但检查的是null而不是"真实性";它等同于isset($a) ? $a : $b(这称为零合并运算符)
<?php
// PHP < 7
$id = isset($id) ? $id : [];
// PHP >= 7
$id = $id ?? [];

自 PHP 7 及以上
版本起 空合并运算符
另一个有用的链接

小心!

我发现PHP对empty的处理是非常值得怀疑的:

  • empty($unsetVar)== true(太棒了,无需检查isset因为警告被抑制了!
  • empty(null)== 真
  • empty('')== 真

一切都很好,直到我们胡说八道:

  • empty(false)== 真。等等,什么
  • ???

一定是在跟我开玩笑。在任何世界里false都不应该被视为根本没有价值! 错误的断言没有什么"空洞的"。由于这种逻辑谬误,您不能使用empty来检查任何可能具有VALUEfalse的变量。

在我的项目中,我使用静态方法:

public static function hasValue($value) {
return isset($value) && !is_null($value) && $value !== '';
}

当然,使用这种方法,我不再得到empty提供的免费警告抑制,所以现在我也不得不记得用通知/警告抑制运算符调用上面的方法@

if(self::hasValue(@$possiblyUnsetVar)) {}

非常令人沮丧。

最新更新