Php “三值操作返回”;“未定义的属性”;

Php “三值操作返回”;“未定义的属性”;,php,ternary-operator,Php,Ternary Operator,我已经从使用这个三元操作切换到if/elseif/else,但我真的很想知道为什么它不起作用。我不断得到错误: ErrorException[注意]:未定义的属性:stdClass::$error 如果我要切换条件的顺序,以便$res->response片段是第三个,那么我会得到相同的错误,但该属性是相反的。这对我来说毫无意义,在Codepad.org(使用PHP5.2)上进行测试,结果与预期一样: 下面是有问题的测试代码: $output = '{"error":{"message":"Thi

我已经从使用这个三元操作切换到if/elseif/else,但我真的很想知道为什么它不起作用。我不断得到错误:

ErrorException[注意]:未定义的属性:stdClass::$error

如果我要切换条件的顺序,以便
$res->response
片段是第三个,那么我会得到相同的错误,但该属性是相反的。这对我来说毫无意义,在Codepad.org(使用PHP5.2)上进行测试,结果与预期一样:

下面是有问题的测试代码:

$output = '{"error":{"message":"This is a test error"}}';
$res = json_decode($output);

$error = isset($res->response) ? $res->response->message :
     isset($res->error) ? $res->error :
     isset($res->error->message) ? $res->error->message :
     $output;

echo $error;
(它检查
$res->error
$res->error->message
的原因是我们正在使用的API将返回我们正在检查的三个条件中的任何一个。免责声明:这不是我的API!)

关于我为什么没有得到我期望的结果,有什么见解吗?非常感谢您的帮助

编辑:

澄清一下,这就是我试图实现的目标:

if (isset($res->response))
{
    $error = $res->response->message;
}
elseif (isset($res->error->message))
{
    $error = $res->error->message;
}
elseif (isset($res->error))
{
    $error = $res->error;
}

不要嵌套三元运算符

由于三元运算符的求值顺序,您会看到错误;这样写出来会更好,更易于维护:

if (isset($res->response)) {
  $error = $res->response->message;
} elseif (isset($res->error)) {
  if (isset($res->error->message)) {
    $error = $res->error->message;
  } else {
    $error = $res->error;
  }
} else {
  $error = $output;
}
您的旧代码的计算结果如下;即使如此,真正发生的事情也不明显:

((isset($res->response) ? $res->response->message :
isset($res->error)) ? $res->error :
isset($res->error->message)) ? $res->error->message :
$output;

另请参见:

这是在哪个版本的PHP上运行的?对不起,我不能不对嵌套三元进行向下表决。它不是嵌套三元。它确实是嵌套三元。在你做这件事的方式中加入三元结构被认为是不好的做法。把它写出来,我确信问题会变得很清楚。也许这就是我的问题所在。。。我没有在这里筑巢。我只是检查每个条件是否为真,并相应地赋值。这就是我最终要做的。但是我不知道为什么三元数不起作用。@DondeEstaMiCulo我回答的第二部分向您展示了代码的实际计算方式。很有趣。我不明白为什么它会这样评价它。是因为我有太多的条件吗?据我所知,三值运算只是if/elseif/else的简写替代品。@DondeEstaMiCulo三值运算符从左到右求值,而
if/else
使用分支来清楚地描述每个要赋值的值。