Share on Facebook
このエントリーをはてなブックマークに追加
はてなブックマーク - PHPの三項演算子をネストした時の挙動がおかしい話

標題の通り、PHPにおいて三項演算子をネストした時の挙動がおかしい話。
例えば、以下のようなコードの場合。

echo (1 == 1) ? "one" : (2 == 2) ? "two" : "false"; // "two"

他の主要な言語と同じように、”one”が表示されることを期待してたんですが”two”が表示されますね。何かの間違いかと思って3回ぐらい試した。

と思ったら、マニュアルにしっかり書いてありました。

三項演算子を “積み重ねて” 使用することは避けましょう。 ひとつの文の中で複数の三項演算子を使用した際の PHP の振る舞いは、 少々わかりにくいものです。

PHP: 比較演算子 – Manual

マニュアルの通り、基本的に三項演算子はネストすべきではないですが、どうしても使いたい場合は以下のように括弧を付けると期待通りの結果になります。

echo (1 == 1) ? "one" : ((2 == 2) ? "two" : "false"); // "one"

蛇足ですが、マニュアルの上記ページにあるようにPHP5.3からは三項演算子の真ん中が省略できるようになったようです。

$hoge = "hoge";
echo ($hoge) ?: "fuga"; // "hoge"

$hoge = null;
echo ($hoge) ?: "fuga";  // "fuga"

これはいい仕様変更ですね。

そもそも三項演算子をネストするのってどうなのよ、って話ではありますが、
ちょっとしたワンライナーを書くときなんかは便利に使えるので参考までに。

   
© 2011 sanojimaru.com Suffusion theme by Sayontan Sinha