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)
谷歌搜索没有透露任何有关该主题的信息。
只要您(分别)仅尝试访问键或属性,数组访问或对象对象语法末尾的空合并将完美运行,不会出现任何通知、警告或错误。
代码:(演示)(与 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)
仅当链接方法时才需要空安全运算符。
如果您有这样的基础课程:
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会被显示。
因此,最终不要使用空安全运算符,除非您的链中有方法。您永远不需要担心使用数组创建空安全“链”,因为数组不提供这样的功能来以这种方式链接函数/方法。
| 归档时间: |
|
| 查看次数: |
6614 次 |
| 最近记录: |