具有C#背景,我总是在Acessing类属性时使用?.
操作员(使用实体框架关系时)。
例如,如果我使用它并且状态类为null,则它将引发异常,因为我试图将属性从null对象中获取。
var order = DB.Order.Find(1);
var status = order.status.text;
为了解决这个问题,我可以做这样的事情:
var address = order.status?.text ?? "No status";
?.
操作员将在第一个空中打破并跳过其余的Acessings。
我在PHP中遇到了同样的情况,必须做类似的事情:
$order = Orders::find(1);
$status = $order->status->text;
如果状态为空,则会抛出相同的异常(试图从空对象中获取属性)。
,但是我这样做了,它起作用了:
$status = $order->status->text ?? "No status";
显然,如果status
为null,则PHP会跳过->text
。
我创建了一个小提琴来检查这不仅在我的环境中,而且令人惊讶的是效果很好!
<?php
$j = "Hello!";
echo $a->b->c->d->e ?? $a->b->c->d ?? $a->b->c ?? $a->b ?? $j;
&lt;&lt;"你好!"
这真的是PHP中??
操作员的预期行为吗?因为我没有在文档中看到这一点。
经过一些研究,我发现在php 7中添加的null条件运算符(??
)基本上是 isset()
函数的语法糖如果在三元电话中使用。
echo isset($a->b->c) ? $a->b->c : "Hello!";
ISSET函数的文档显示了尝试访问深数数字值的明确示例:
<?php
$a = array ('test' => 1, 'hello' => NULL, 'pie' => array('a' => 'apple'));
// Checking deeper array values
var_dump(isset($a['pie']['a'])); // TRUE
var_dump(isset($a['pie']['b'])); // FALSE
var_dump(isset($a['cake']['a']['b'])); // FALSE
?>
当变量为null时,isset()
函数不会抛出E_NOTICE
,它只是跳过其余的Acessing。由于NULL COCECE操作员基本上在内部使用isset()
,因此在尝试访问Null对象上的属性时也不会引发异常。
这是指向实施建议的链接,它包含一个链接,其中包含该操作员的源代码的合并请求。