問題
問1
以下のコードの$num
が1, 2, 3
それぞれの場合の出力結果はどうなるか?
print($num == 3 ? $num == 2 ? "2です。" : "3です。" : "1です。");
答えは、こう。
$num = 1; // 1です。
$num = 2; // 1です。
$num = 3; // 3です。
$num = 2
の時だけ答えが期待値とはズレてるね。
では、次の問題。
問2
以下のコードの$num
が1, 2, 3
それぞれの場合の出力結果はどうなるか?
print($num == 3 ? "3です。" : $num == 2 ? "2です。" : "1です。");
答えは、こう。
$num = 1; // 1です。
$num = 2; // 2です。
$num = 3; // 2です。
今度は$num = 3
の時、答えがズレている。
なぜこうなったのか?PHPにおける__三項演算子__のネストはどうなるかを確認した。
三項演算子の詳細
PHPの公式ページより、PHPにおける三項演算子の仕様を確認したところ、
(expr1) ? (expr2) : (expr3) という式は、式1 が TRUE の場合に 式2 を、 式1 が FALSE の場合に 式3 を値とします。
PHP 5.3 以降では、三項演算子のまんなかの部分をなくすこともできるようになりました。 式 expr1 ?: expr3 の結果は、expr1 が TRUE と同等の場合は expr1、 それ以外の場合は expr3 となります。
(公式ページより引用)
とありました。簡単に言うと、左から右に評価されるということ。公式ページを読み進めていくといくつか注意点が記載されているが、その中に__「三項演算子を "積み重ねて" 使用することは避けましょう。」__とあった。そもそも三項演算子をネストすることは避けるべきらしい。(笑)
※まぁ、わざわざ三項演算子でネストするくらいなら、if-else
文やswitch
文で書けよ、ってことかな。
プログラムの解説
上記を踏まえて、二つの問いのプログラムの解説をば。
問1のプログラムは以下のコードを同じものとなる。
print($num == 3 ? ($num == 2 ? "2です。" : "3です。") : "1です。");
したがって$num = 3
以外の時は全て "1です。" が表示される事になる。これは簡単。
続いて問2のプログラムは以下のコードと同じ。
print(($num == 3 ? "3です。" : $num == 2) ? "2です。" : "1です。");
$num = 3
の時、($num == 3 ? "3です。" : $num == 2)
の結果は "3です。" となる。この結果をもって次の三項演算子に処理が移るので、
全体としては("3です。" ? "2です。" : "1です。")
となる。ここで、"3です。"はPHPではtrue
と見なされるため、"2です。"が表示される事になる。
ちなみに三項演算子を二重ではなく三重にしようとしたら、syntax error
となったので、実行できないようだ。(そんなプログラムを書くことはおそらくないとは思うが)
自分の書き方がミスっていただけでした。すみません。