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
失败,则数组为空,循环什么也不做。
有些事情我不太清楚,??
、?:
和 ??=
在 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
失败,则数组为空,循环什么也不做。