PHP初心者でも熟練の人でもみんなが使う「if文」。条件分岐の基本でfor文と並びよく使われる構文ですが、このif文をちょっと良い感じに、ちょっとスマートに書く「三項演算子」のご紹介。
三項演算子の例
まずifとelseのシンプルな書き方です。この2行の結果はどちらも同じで、$numの値をみて$textに”1です”か”1ではありません”かを代入します。
if($num == 1){ $text = '1です';}else{ $text = '1ではありません';} //上下どちらも同じ結果を返します。 $text = $num == 1 ? '1です' : '1ではありません';
三項演算子を使う時のechoとprint
変数に代入するだけでなく、文字列をそのまま出力することもよくありますよね。その際にif文で下記のように書いたとします。
if($num == 1){ echo = '1です';}else{ echo = '1ではありません';}
文字列の出力にはechoがよく使われますが、これと同じ結果を三項演算子で書く場合、以下のような挙動となります。
$num = 1; //エラーになり、動作しません $num == 1 ? echo '1です' : echo'1ではありません'; //問題ありません $num == 1 ? print '1です' : print'1ではありません'; //問題ありません echo $num == 1 ? '1です' : '1ではありません';
echoならエラーになるのにprintだとエラーにならない。意外とハマりやすい現象ですが、エラーの意味は理解しておいた方が良いでしょう。
if文と三項演算子、echoとprint、それぞれの違い
そもそもif文は構文ですが、三項演算子は文字通り「演算子」であり「式」です。そしてechoは言語構造のため戻り値が無く、printは関数で戻り値があります。これらの違いにより、三項演算子という「式」の中において、「戻り値のない」echoがあると「エラーになる」という結果になります。以下のような例で考えるとエラーになるのも納得かと思います。
$num = 1; //問題ありません echo $num + 1; //エラーになり、動作しません $num + echo 1; //問題ありません、5が出力されます $num + print(5); //問題ありません、5と2が出力されます echo $num + print(5);
最後がなぜ5と2が出力されるのか。まず「print(5)」で5が出力されますね。そしてprint関数は常に「1」を返すため「$num + print(5)」の計算式の結果は「2」となります。その結果をechoで出力しているため「2」が表示されます。
応用
この三項演算子、かなり応用がきくようで、重ねて記述する「二重三項演算子(例 $a ? $b : $c ? $d : $e;)」や、一部のみの記述($a && $b=1; や $a || $b=1; など)といった書き方も可能。複雑になるとif文の方が可読性が高い場合もあるのでケースバイケースですが、慣れるととても使いやすい三項演算子でした。