【问题标题】:Ternary operation returning "Undefined Property"三元运算返回“未定义的属性”
【发布时间】:2013-03-03 05:58:19
【问题描述】:

我已经从使用这个三元运算切换到 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;
}

【问题讨论】:

  • 这是在什么版本的 PHP 上运行的?
  • 抱歉,我忍不住要对嵌套三元组投反对票。
  • 它不是嵌套的三元。
  • 那确实是嵌套的三元。以您的方式嵌套三元组被认为是不好的做法。把它写出来,我相信问题会变得清晰。
  • 也许这就是我的问题所在......我没有在这里嵌套任何东西。我只是检查每个条件是否为真,并相应地分配值。

标签: php ternary-operator


【解决方案1】:

不要嵌套三元运算符。

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

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

【讨论】:

  • 这基本上是我最终做的。但是我不知道为什么三元不起作用。
  • @DondeEstaMiCulo 我的回答的第二部分向您展示了您的代码是如何被实际评估的。
  • 有趣。我不明白为什么它会这样评估它。是不是因为我的条件太多了?据我了解,三元运算只是 if/elseif/else 的简写替代。
  • @DondeEstaMiCulo 三元运算符从左到右求值,而if/else 使用分支来清楚地描述要分配的每个值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-25
  • 1970-01-01
  • 2018-05-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多