PHPには3項演算子という3つのオペランド(被演算子)を使う演算子があります。書き方が特殊ですが、上手に使うと見やすくわかりやすいコードが書けます。
そこで今回は、PHPの3項演算子がどのようなものか、特徴と注意点を交えて解説します。
目次
3項演算子とは何か
3項演算子は3つのオペランド(非演算子)を使う演算子で、次のように書きます。
1 |
condition ? expr1 : expr2; |
それぞれの演算子について説明します。
- condition
- 第1演算子です。このオペランドが条件として評価されます。
- expr1
- 第2演算子です。condition が true と評価された場合に評価して結果を返します。
- expr2
- 第3演算子です。condition が false と評価された場合に評価して結果を返します。
では、簡単なサンプルコードを見てみましょう。
1 2 3 |
<?php $num = 1; echo $num == 1 ? '正しい' : '間違い'; |
このコードはまず condition の $num == 1 を評価します。評価結果は真なので expr1 を評価して文字列「正しい」を返します。返された文字列はechoによって出力されるので
という文字列が表示されます。
3項演算子とif構文の違いを理解しよう
先ほどのコードはif構文の動作とよく似ていることに気づいたでしょうか。if構文を使って同じように動作するサンプルコードを見てみましょう。
1 2 3 4 5 6 7 |
<?php $num = 0; if ($num == 1) { echo '正しい'; } else { echo '誤り'; }; |
If構文はカッコ内の演算子を論理値で評価します。その結果で分岐して命令を実行します。サンプルコードの場合、$num == 0 の評価結果が真なので
1 |
echo '正しい'; |
が実行されます。
If構文と比べると、3項演算子の動作がよくわかると思います。ただし if構文は条件で分岐して命令を実行するのに対し、3項演算子は演算子を評価することに注目してください。
間違った3項演算子の使い方
先ほどのIf構文のサンプルコードの構造をそのまま、3項演算子に置き換えてみましょう。
1 2 3 |
<?php $num = 0; $num == 1 ? echo '正しい' : echo '間違い'; |
一見、問題ないコードのように見えます。しかし、echo文はその後ろのパラメータを出力しますが、結果は何も返しません。演算子として評価できないためエラーとなってしまいます。
3項演算子は使わない方がいい?
3項演算子は読みにくい(可読性)が悪い、ということを言われることがあります。確かに、慣れてないとわかりにくいかもしれませんが、慣れてると1行で解決できるため、if構文よりシンプルなコードを書けるメリットがあります。
ですが、3項演算子を無理に使おうとすると、余計にわかりにくくなる場合があります。
1 2 |
<?php $result = 条件式1 ? 条件式2 ? 'A' : 'B' : 'C'; |
このような書き方をネスト(入れ子)と呼びますが、ひと目で簡単にわかるコード……とは言えませんよね。これをif構文で書くとこうなります。
1 2 3 4 5 6 7 8 9 10 |
<?php If (条件式1){ if (条件式2) { $result = 'A'; } else { $result = 'B'; } } else { $result = 'C'; }; |
どうしても3項演算子を使うならカッコを加えて
1 2 |
<?php $result = 条件式1 ? (条件式2 ? 'A' : 'B') : 'C'; |
とするか、改行を入れて
1 2 3 4 |
<?php $result = 条件式1 ? 条件式2 ? 'A' : 'B' : 'C'; |
とする方法もありますが、if構文より分かりやすい……とは言えません。3項演算子とif構文を使い分けて、誰が見てもわかるようなコードを書くよう心がけましょう。
PHPの3項演算子は注意が必要
3項演算子はPHP特有の命令ではありません。ほぼ同じような記述で使える他のプログラム言語もあります。他のプログラム言語で3項演算子を使っていたから使い方は理解している……と思っていると、ちょっとした落とし穴があるので注意が必要です。
次のサンプルコードを見てください。
1 2 3 |
<?php $foo = 1; echo $foo == 1 ? '1' : $foo == 2 ? '2' : '3'; |
一般的な3項演算子の動作の場合 1 が出力されるのですが、PHPは 2 が出力されます。これを左結合と呼びますが、その違いはカッコをつけるとよくわかります。
1 2 |
<?php echo $foo == 1 ? '1' : ($foo == 2 ? '2' : '3'); |
1 2 |
<?php echo ($foo == 1 ? '1' : $foo == 2) ? '2' : '3'; |
3項演算子は右結合という前提でPHPの3項演算子を使うと、意図した結果にならないことがあります。カッコをつけると優先順位を明示できるので、3項演算子を使う場合は必ずカッコをつけるか、ネストさせないようにした方が良いでしょう。
3項演算子の便利な使い方
3項演算子は読みにくい、PHPの3項演算子は左結合なので使いにくい、といった悪い点が目につきますが、悪いことばかりではありません。
PHPの場合、3項演算子を上手に使うとコードが見やすくなる場合もあります。状況に合わせて使い分けることを心がけましょう。
HTMLに埋め込んで使う
3項演算子のPHPならではの便利な使い方があります。
1 |
<?php echo 条件式 ? '正しい' : '間違い'; ?> |
これはHTMLにPHPのコードを埋め込んだ書き方です。3項演算子を使って1行で解決しているので、コードがすっきりしています。これをif構文で書くとこのようになります。
1 2 3 4 5 6 7 |
<?php if (条件式) { echo '正しい'; } else { echo '間違い'; } ?> |
if構文は1行にまとめて書けますが、3項演算子の方がわかりやすい場合は置き換えることも考えて見てください。
if構文と併用する
If構文は条件分岐が多くなると、ネストが深くなりがちです。単純な真偽の分岐でネストが深くなるのを避けるため、3項演算子と併用するとコードが見やすくなります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<?php if (条件式) { if (条件式) { echo 'リンゴ'; } else { echo 'ナシ'; } } else { if (条件式) { echo 'ミカン'; } else { echo 'レモン'; } } |
1 2 3 4 5 6 |
<?php if (条件式) { echo (条件式) ? 'リンゴ' : 'ナシ'; } else { echo (条件式) ? 'ミカン' : 'レモン'; } |
if構文と3項演算子を併用するとネストが浅くなり、コードが見やすくなることがお分かり頂けたでしょうか。
エルビス演算子は3項演算子?
3項演算子と記述が似ているエルビス演算子をご存じでしょうか。エルビス演算子は2つのオペランド(非演算子)を使う演算子で、次のように書きます。
1 2 |
<?php expr1 ?: expr2; |
3項演算子の第2項を省略したようになっているのがわかりますか?
それぞれの演算子について説明します。
- expr1
- 第1演算子(左辺)です。expr1 が true と評価された場合、評価された結果をそのまま返します。
- expr2
- 第2演算子(右辺)です。expr1 が false と評価された場合に評価して結果を返します。
では、エルビス演算子を使った簡単なコードを見てみましょう。
1 2 3 |
<?php $value = 1; echo ($value = $value + 1) ?: 0; |
この例の場合、左辺の $value = $value + 1 は真となるため、 $value = $value + 1 を評価した結果の 2 が表示されます。
ところで、エルビス演算子は「3項演算子の第2項を省略したような書き方」と説明しましたが、3項演算子で同じようにコードを書いてみましょう。
1 2 3 |
<?php $value = 1; echo ($value = $value + 1) ? ($value = $value + 1) : 0; |
この結果も同じように 2 が表示されそうですが、実は 3 が表示されます。理由は3項演算子がそれぞれの演算子を評価するからです。流れとしては次のようになります。
- STEP.1第1演算子が真か偽か評価します$value = $value + 1が評価され、$valueの値が 2 になります
- STEP.2第1演算子が真なので第2演算子を評価します$value = $value + 1が評価され、$valueは 3 になります
- STEP.3第2演算子の評価結果を返します$valueが3なので3が出力されます
エルビス演算子の場合、左辺は評価した結果がそのまま返るので 2 となります。つまり3項演算子がエルビス演算子と同じ結果を得るためには
1 2 3 4 |
<?php $value = 1; $value = $value + 1; echo $value ? $value : 0; |
という書き方にしないといけません。
まとめ
いかがでしたか? 今回はPHPの3項演算子がどのようなものか、特徴と注意点を交えて解説しました。
慣れないうちは使い方が難しいかもしれませんが、理解が深まると見やすく、分かりやすいプログラムが組めるようになります。
特徴と注意点を理解して、3項演算子を使いこなせるよう頑張ってください。