PHP ??、?: 和 ??= 之间的区别

Difference between PHP ??, ?:, and ??=

有些事情我不太清楚,???:??= 在 PHP 中有何不同?

我知道 ??= 是在 PHP7.4 中才添加的。 我也知道 ?? 用于检查空值,但 ?: 似乎也检查空值,所以我不完全确定其中的区别。

合并之前问题中已经做出的所有答案。使用 ?? 检查是否存在而不是 null,使用 ?: 检查 true/false.

$result = $a ?? $b

等同于:

if (isset($a) && !is_null($a)) {
    $result = $a;
} else {
    $result = $b;
}

??=?? 的快捷方式,它的工作方式类似于 .=+=,这意味着您可以缩短

$a = $a ?? $b;

$a ??= $b;

?:是三元运算符的快捷方式,也是快捷方式:

if ($a) {
    $result = $a;
} else {
    $result = $b;
}

等同于:

$result = $a ? $a : $b;

等同于:

$result = $a ?: $b;

你们都可以描述为:第一个操作数是要检查的值,如果这个有用,就用它,如果没有,就用第二个作为默认值。

您可以像这样连接它们:

$user = $_POST['user'] ?? $_SESSION['user'] ?? $_COOKIE['user'] ?? '';

意思是这样的:如果你因为刚刚登录得到了POST数组中的用户名,那好吧,拿去,如果没有,看看用户是否已经登录并在session中,如果是,接受它,如果不是,也许我们在 Cookies 中有一个用户(上次登录时选中了“记住我”复选框),如果这也失败了,那么请将其留空。

当然你也要检查密码。 ;-)

编辑:我经常使用 ?: 运算符来确保我在变量中具有特定的数据类型。有很多 PHP 函数在成功时可能返回一个字符串或数组,但如果发生错误则 false 。结果为 false,空字符串或空数组更一致。例如,scandir 应该返回一个数组,但如果发生错误则返回 false。所以你可以这样做:

$files = scandir('/some/random/folder') ?: [];

那么 $files 将永远是一个数组,即使 scandir 失败。那么,它是一个空数组,但可能比稍后检查 false 更好。事实上,我们已经毫不费力地做到了。然后你可以使用一个 foreach 循环而不用一些包装 if。如果 scandir 失败,则数组为空,循环什么也不做。