0

この 3 項演算の使用から if/elseif/else に切り替えましたが、これが機能しない理由を知りたいです。エラーが発生し続けます:

ErrorException [通知]: 未定義のプロパティ: stdClass::$error

ピースが 3 番目になるように条件の順序を変更すると$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->errorandをチェックする理由$res->error->messageは、使用している API が、チェックしている 3 つの条件のいずれかを返すためです。免責事項: これは私の 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;
}
4

1 に答える 1

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;

参照:比較演算子

于 2013-03-03T06:04:23.597 に答える