在旧的PHP中,IF语句编写为
if ($a && $a->b()) {
...
}上面的内容可以用PHP8编写为
if ($a?->b()) {
...
}一个类的方法可以简单地(没有方程)作为
$a?->b();而不是
if ($a) {
$a->b();
}发布于 2022-09-21 10:00:52
这两种说法在技术上并不等同,但可能是有意的。
?->操作符名为无空算子,它专门检查左侧的空。如手册中所述:
其效果类似于首先在is_null() check中包装每个访问,但更紧凑。
因此,以下所有内容都是等价的
if (is_null($a) && $a->b()) {
echo 'here';
}
if ($a === null && $a->b()) {
echo 'here';
}
if ($a?->b()) {
echo 'here';
}然而,这并不完全是您所写的;您“在布尔上下文中”使用了$a,这意味着您正在检查的只是它是“真实的”或“不为空的”。为了证明这一点,请考虑:
$a = false;
if ($a && $a->b()) {
echo 'here';
}在这里,现有代码将快捷,但空安全运算符不会。完整的意图版本可能如下所示:
$a = true;
if ($a instanceof SomeClass && $a->b()) {
echo 'here';
}实际上,您可能已经知道$a要么是正确的对象,要么是null (例如,它对参数或属性传递了?SomeClass类型约束),在这种情况下,?->无明文安全运算符意味着您不再需要额外的检查。
https://stackoverflow.com/questions/73794823
复制相似问题