2017年5月10日

if文をスマートに。慣れるととても使いやすい「三項演算子」

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文の方が可読性が高い場合もあるのでケースバイケースですが、慣れるととても使いやすい三項演算子でした。

,

コメントを残す

メールアドレスが公開されることはありません。