是否有用于访问数组数据的空安全运算符?

Pet*_*lev 14 php arrays optional-chaining

据我所知,空安全运算符不适用于数组。是否有另一种方法可以通过数组链接达到相同的效果?

例如:

$array = [];

if (isset($array['a'])) {
    if (isset($array['a']['b'])) {
        // run
    }
}
Run Code Online (Sandbox Code Playgroud)

变成:

$array<null-safe-oprator>['a']<null-safe-operator>['b'];
Run Code Online (Sandbox Code Playgroud)

谷歌搜索没有透露任何有关该主题的信息。

mic*_*usa 2

只要您(分别)仅尝试访问键或属性,数组访问或对象对象语法末尾的空合并将完美运行,不会出现任何通知、警告或错误。

代码:(演示)(与 isset() 相同

var_export($array['does']['not']['exist'] ?? 'nope');
    
echo "\n---\n";

var_export($obj->does->not->exist ?? 'nope');
Run Code Online (Sandbox Code Playgroud)

输出:

'nope'
---
'nope'
Run Code Online (Sandbox Code Playgroud)

即使是混合访问(包含键和值的属性的路径)也不会出现问题。(演示

var_export(isset($obj->does[123]->not->exist[678]['foo']) ? $obj->does[123]->not->exist[678]['foo'] : 'nope');
// nope
Run Code Online (Sandbox Code Playgroud)

仅当链接方法时才需要空安全运算符。

请参阅PHP 中是否有“nullsafe 运算符”?

如果您有这样的基础课程:

class Test
{
    public function doThing($v) {
        return $v;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后你运行这段代码:

$object = null;
var_export($object->doThing('foo') ?? 'oops');
Run Code Online (Sandbox Code Playgroud)

你会得到:

Fatal error: Uncaught Error: Call to a member function doThing() on null
Run Code Online (Sandbox Code Playgroud)

如果您改为运行以下代码:

$object = null;
var_export($object?->doThing('foo'));
Run Code Online (Sandbox Code Playgroud)

你会看到该doThing()方法不会被到达并且null会被显示。

因此,最终不要使用空安全运算符,除非您的链中有方法。您永远不需要担心使用数组创建空安全“链”,因为数组不提供这样的功能来以这种方式链接函数/方法。