为什么在未声明的属性之前使用 nullsafe 运算符时,我会得到 Undefined property: stdClass:: with PHP8 ?

问题描述 投票:0回答:2

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,
];

要解决该错误,我必须使用空合并运算符:

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

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

为什么 nullsafe 运算符在这种情况下会抛出错误?

php properties null null-coalescing-operator nullsafe
2个回答
18
投票

您似乎对 nullsafe 运算符的作用有轻微的误解。

如果

$reference
null
,那么
$reference?->first_name
将返回
null
且没有任何警告,但由于
$reference
实际上是一个对象,所以
?->
只是像普通对象运算符一样工作,因此会出现未定义属性警告。


1
投票

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

try {
    if ($response->foo->bar->foo->bar->status == 'something') {
        ...
    }
} catch (\ErrorException $ex) {
    // Property missing exception will be caught here
}
© www.soinside.com 2019 - 2024. All rights reserved.