无效的条件操作员总是会在第一个null Orcurrence上断裂



具有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对象上的属性时也不会引发异常。

这是指向实施建议的链接,它包含一个链接,其中包含该操作员的源代码的合并请求。

最新更新