PHPで、三項演算子の結果を文字列結合して表示したいことがあり、次のようにコードを書いてみて『結果:Ok』を期待したけれど、実際に出力されるのは『Ok』のみ。
「結果:」の形跡はまったくなく不思議。いったいどこにいってしまったのだろうか。
$hoge = 3;
echo '結果:'. ($hoge == 3) ? 'Ok' : 'Ng';
>Ok
とりあえずググってみた
「teratail」で質問と回答を見つけた。
(’答えは’.0) ? '正解!' : '間違い!';
('答えは、0’) ? '正解!' : '間違い!';
(TRUE) ? ' 正解!' : '間違い!';なので、三項演算子の部分を()で囲みましょう。
「三項演算子の部分を()で囲み」で解決なのだけれど、少し丁寧に理解しておこうと思う。
1つ1つ動きをみていく
読み解くには「演算子の優先順位」が分かればOKです。
echo '結果:'. ($hoge == 3) ? 'Ok' : 'Ng';
この文の演算子は、3つ
演算子 | 名前 |
---|---|
. | 文字列演算子 |
== | 比較演算子 |
? : | 三項演算子 |
優先順位は、上から順に、.
> ==
> ? :
となる。
でも括弧で囲われているところが一番最初に評価される。
($hoge == 3)
は、true だ。
echo '結果:'.true ? 'Ok' : 'Ng';
でお次は、三項演算子より文字列演算子の方が、優先順位の高いので、'結果:'.true
の文字列結合が行われる。
true の型変換が起こって、'結果:1'
になるのかな。
echo '結果:1' ? 'Ok' : 'Ng';
そして最後に三項演算子が評価され、文字列の 結果:1
は、true と判断されるので前に書いた式が、echo される。
echo 'Ok';
>'Ok'
一見「何が起こったんだ!」と慌ててしまったけれども、しごく仕様通りの動きだったことが分かる。前の文字列と参考演算子の条件の結果が結合されてしまっていたんですね...
蛇足だけれど、今回のケースでは、以下のように三項演算子の部分を括弧で囲んでしまえばOK。
これで、最初に三項演算子が評価されるので、期待通りに出力されます。
$hoge = 3;
echo '結果:'. (($hoge == 3) ? 'Ok' : 'Ng');
>'結果:Ok'