使用 PHP 8 的 Nullsafe 运算符时为什么会出现“Undefined property: stdClass::”错误?

8

Php 8.0引入了nullsafe运算符,可以这样使用:$foo?->bar?->baz;。 我有一个在php 8.1上运行的代码示例,即使使用了nullsafe运算符,仍会抛出错误Undefined property: stdClass::$first_name

$reference = (object) $reference; // Cast of array to object

return [
    'FirstName' => $reference?->first_name,
];

为了解决这个错误,我必须使用null合并运算符:
$reference = (object) $reference; // Cast of array to object

return [
    'FirstName' => $reference->first_name ?? null,
];

为什么在这种情况下,nullsafe运算符会抛出错误?
2个回答

10

您好像对空安全(nullsafe)操作符的作用有点误解。

如果$referencenull,那么$reference?->first_name将返回null,而不会发出任何警告,但由于$reference实际上是一个对象,?->就像普通的对象操作符一样工作,因此会出现未定义的属性警告。


当你有一个引用链,其中第一个对象肯定存在时,你应该如何处理呢?例如:$exists->maybe->also_maybe? - joachim
1
基本上,只有在左侧为null时,此运算符才会发挥作用。如果设置了$exists对象,但没有maybe属性,则$exists->maybe将产生与问题所询问的空安全运算符并不真正有用的相同问题。如果maybe属性存在,但可能具有空值,则可以在其后使用空安全运算符以防止尝试读取also_maybe或之后链接的任何其他内容时出现警告。如果您不知道链中的第一个属性是否存在,则最好使用?? - Don't Panic

0

如果你有许多嵌套属性,可以使用try-catch:

try {
    if ($response->foo->bar->foo->bar->status == 'something') {
        ...
    }
} catch (\ErrorException $ex) {
    // Property missing exception will be caught here
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接