5月 072011
標題の通り、PHPにおいて三項演算子をネストした時の挙動がおかしい話。
例えば、以下のようなコードの場合。
echo (1 == 1) ? "one" : (2 == 2) ? "two" : "false"; // "two"
他の主要な言語と同じように、”one”が表示されることを期待してたんですが”two”が表示されますね。何かの間違いかと思って3回ぐらい試した。
と思ったら、マニュアルにしっかり書いてありました。
三項演算子を “積み重ねて” 使用することは避けましょう。 ひとつの文の中で複数の三項演算子を使用した際の PHP の振る舞いは、 少々わかりにくいものです。
マニュアルの通り、基本的に三項演算子はネストすべきではないですが、どうしても使いたい場合は以下のように括弧を付けると期待通りの結果になります。
echo (1 == 1) ? "one" : ((2 == 2) ? "two" : "false"); // "one"
蛇足ですが、マニュアルの上記ページにあるようにPHP5.3からは三項演算子の真ん中が省略できるようになったようです。
$hoge = "hoge"; echo ($hoge) ?: "fuga"; // "hoge" $hoge = null; echo ($hoge) ?: "fuga"; // "fuga"
これはいい仕様変更ですね。
そもそも三項演算子をネストするのってどうなのよ、って話ではありますが、
ちょっとしたワンライナーを書くときなんかは便利に使えるので参考までに。