2013-03-03 80 views
0

我已经从使用这个三元操作切换到if/elseif/else,但是我真的很想知道为什么这样不起作用。我不断收到错误:返回“未定义属性”的三元操作

ErrorException [ Notice ]: Undefined property: 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; 
} 
+0

哪个版本的PHP是这样运行的? – 2013-03-03 06:02:45

+0

对不起,但我无法帮助downvoting嵌套三元。 – 2013-03-03 06:02:48

+0

这不是一个嵌套的三元组。 – DondeEstaMiCulo 2013-03-03 06:05:46

回答

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

+0

这基本上是我最终做的。但我不知道为什么三元不工作。 – DondeEstaMiCulo 2013-03-03 06:07:04

+0

@DondeEstaMiCulo我的答案的第二部分向您展示了您的代码是如何评估的。 – 2013-03-03 06:10:25

+0

有趣。我不明白为什么它会这样评估它。是因为我的条件太多了吗?根据我的理解,三元操作只是if/elseif/else的简写替换。 – DondeEstaMiCulo 2013-03-03 06:19:40