0

拥有 C# 背景,我在访问?.类属性时(使用实体框架关系时)总是使用运算符。

例如,如果我使用它并且状态类为空,它会抛出异常,因为我试图从空对象中获取属性。

var order = DB.Order.Find(1);

var status = order.status.text;

为了解决这个问题,我可以这样做:

var address = order.status?.text ?? "No status";

运算符将?.在第一个 null 处中断并跳过其余的访问。

我在 PHP 中遇到了同样的情况,不得不做这样的事情:

$order = Orders::find(1);
$status = $order->status->text;

如果状态为空,它会抛出相同的异常(试图从空对象中获取属性)。

但后来我这样做了,它奏效了:

$status = $order->status->text ?? "No status";

显然,->text如果status为空,PHP 将跳过访问。

创建了一个小提琴来检查这是否不仅在我的环境中,而且令人惊讶的是它工作得很好!

<?php
$j = "Hello!";
echo $a->b->c->d->e ?? $a->b->c->d ?? $a->b->c ?? $a->b ?? $j;

<<“你好!”

这真的是??PHP 中运算符的预期行为吗?因为我没有在文档中看到这一点。

4

1 回答 1

0

经过一番研究,我发现??PHP 7 中添加的空条件运算符 ( ) 基本上是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

?>

当变量为空时,该isset()函数不会抛出E_NOTICE异常,它只是跳过其余的访问。由于 null 合并运算符基本上在isset()内部使用,因此在尝试访问 null 对象上的属性时也不会引发异常。

这是实现建议的链接,它包含指向包含此运算符源代码的合并请求的链接。

于 2017-12-06T11:17:41.180 回答