1

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

$id = [];

$id = null || [];

if (count($id)) {
  echo 'd';
}

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

4

3 回答 3

7

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

所以你的陈述被评估为“要么是要么是null真的[]?” 由于两者null和一个空数组都评估为 false,因此结果为 boolean false

然而,有两个运算符会做类似于 JS 的事情||

  • $a ?: $b$a ? $a : $b;的简写 换句话说,它评估$a它是否“真实”,或者$b如果不是(这与它作为速记的三元运算符一起记录)
  • $a ?? $b相似,但检查null而不是“真实性”;它等效于isset($a) ? $a : $b(这称为空合并运算符
于 2019-02-23T20:15:08.890 回答
3
<?php

// PHP < 7
$id = isset($id) ? $id : [];

// PHP >= 7
$id = $id ?? [];

自 PHP 7 及更高版本起
Null Coalesce Operator
另一个有用的链接

于 2019-02-23T20:31:07.080 回答
0

小心!

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

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

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

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

一定是在开玩笑吧。在任何世界都不应false被视为与没有价值相同的东西!错误的断言没有什么“空洞的”。由于这种逻辑谬误,您不能使用empty检查任何可能具有VALUE的变量false

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

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

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

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

非常令人沮丧。

于 2022-02-17T01:01:54.577 回答