三元运算返回“未定义属性”


Ternary operation returning "Undefined Property"

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

ErrorException [Notice]: Undefined property: stdClass::$error

如果我要改变条件的顺序,使$res->response块是第三,那么我得到相同的错误,但对于那个属性。这对我来说没有意义,在Codepad.org(使用PHP 5.2)上测试它,它的工作如预期:http://codepad.org/gwteijIe

下面是测试代码:

$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;

参见:比较运算符