为什么这行代码在 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)) {}
非常令人沮丧。