三元操作返回“未定义属性”

时间:2013-03-03 05:58:19

标签: php ternary-operator

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

  

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

如果我要切换条件的顺序以使$res->response块为第3,那么我会得到相同的错误,但是对于该属性而言。这对我来说没有任何意义,并且在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;
}

1 个答案:

答案 0 :(得分:2)

不要嵌套三元运算符。

由于评估三元运算符的顺序,您会看到错误;如此写出来会更好,更易于维护:

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;

另请参阅:Comparison Operators