「PHPの三項演算子って便利って聞くけど、正直よくわからない…」「if文と何が違うの?」「可読性を損なわずに使うにはどうすればいい?」そんな悩みはありませんか?
本記事では、PHPの三項演算子について基本構文から、echo文やnullとの併用、複雑な条件処理の書き方まで、実務で使えるテクニックをわかりやすく解説します。コードを短く・シンプルに保ちつつ、読みやすさも損なわない三項演算子の使いどころが理解してもらえるはずです。ぜひ参考にして、開発現場で活かしてください。
目次
1.PHPの三項演算子とは?
PHPで条件分岐を書く場合if文を使うのが一般的です。ただ、より短くわかりやすく書きたいときには三項演算子を使ってみましょう。コードをすっきりできます。ここでは、三項演算子の基本構文などについて解説します。
PHPにおける三項演算子の構文
三項演算子の基本的な構文は、次の通りです。
条件式 ? 式1 : 式2; |
「条件式がtrueなら式1を、falseなら式2を実行する」という意味になります。
この三項演算子を使ったコード例を見てみましょう。
$result = ($num > 5) ? "大きい" : "小さい"; echo $result; |
このコード例では、変数$numの値が5より大きい場合に「大きい」、それ以外の場合に「小さい」と表示します。1行で条件処理と代入を完結できるため、シンプルなコードにできる点が三項演算子の魅力です。
PHPにおける三項演算子とif文との違いと使い方
三項演算子とif文の違いは、記述の短さと読みやすさといえるでしょう。先ほど紹介したコード例と同じ処理を、if文を使って書くと次のコード例になります。
if ($num > 5) { $result = "大きい"; } else { $result = "小さい"; }
|
いかがでしょうか?三項演算子を使ったほうがコードが短くすっきりとシンプルだと思いませんか?コードが短くなることで、処理の流れが把握しやすくなります。
ただし、条件が複雑な場合や処理内容が複数行にわたる場合には、三項演算子はかえって読みづらくなる恐れがあります。三項演算子とif文を使い分けるポイントとしては、コードがわかりやすくなるかどうかを基準にして判断すると良いでしょう。
PHPで三項演算子を使うメリット
ここでは三項演算子を使うメリットについて紹介します。
コードがコンパクトにできる
三項演算子を使えば、数行にわたるif文を1行でまとめることができます。コード全体が短くなるため、視覚的にもコンパクトに整理できます。
if文の場合のコード例
if ($score >= 80) { $result = "合格"; } else { $result = "不合格"; }
|
三項演算子を使ったコード例
$result = ($score >= 80) ? "合格" : "不合格";
|
このコード例では、$scoreが80以上の場合に「合格」それ以外の場合には「不合格」と表示されます。このコード例のように、ロジックが明確な条件式であれば、if文よりも三項演算子の方がコード量を抑えられます。
読みやすいコードになる
三項演算子を使うと「条件 → true処理 → false処理」の流れが把握しやすいため、シンプルな条件処理であれば読みやすいコードになるでしょう。レビューやメンテナンスのときにも、処理の意図を素早く把握できます。
例えば、次のようなコードであれば、処理内容と流れ、意図が理解しやすいですよね。
echo ($isLoggedIn) ? "ログアウト" : "ログイン"; |
HTMLテンプレート内でも柔軟に使える
PHPを埋め込んだHTMLテンプレートでは、条件によってクラス名や文言を切り替えたいとき、if文よりも三項演算子のほうが柔軟に対応しやすいです。
<p class="<?php echo ($isActive) ? 'active' : 'inactive'; ?>">ユーザー状態</p> |
PHPで三項演算子を使うデメリット
メリットがある一方で、三項演算子には適さない場面や、使い方に注意が必要なケースもあります。コードを短く書ける反面、頻繁に使うと意図が伝わらず、メンテナンス性を損なう恐れがあります。具体的に紹介しますのでご覧ください。
複雑な条件の場合は可読性が低下しわかりにくくなる
条件が多かったり、入れ子構造になっていたりすると、三項演算子の可読性が低下します。特にネストされた三項演算子は、評価の順序が読み取りづらくなり、バグの温床になってしまう恐れがあります。
$label = ($score > 90) ? "優秀" : (($score > 75) ? "合格" : "不合格"); |
このコード例では、理解できる人には便利ですが、三項演算子に馴染みがない方や、トラブル時にコードを読む必要があって急いでいる場合などに、かえってわかりにくくなってしまう恐れがあります。
falseの処理を省略する場合にわかりにくくなる
三項演算子では、true側の処理だけを書いて、false側にnullや空文字を入れて省略可能です。しかし、false側の処理を省略すると、処理の意図が伝わりにくいです。
$hasPermission ? doAction() : null; |
このコード例では、「falseのとき何もしない」のですが、どちらかといえば、if文で明示的に処理を書いたほうがわかりやすいのではないでしょうか。
ぜひ三項演算子とif文とそれぞれのメリットとデメリットを理解した上で、使い分けてみてください。
2.PHPで三項演算子とechoを組み合わせた使い方
PHPの三項演算子は、echo文と組み合わせて使うと便利です。ここでは、PHPで三項演算子とechoを組み合わせた使い方について、基本的な使い方からHTMLとの併用、記述ミスの回避法までを解説します。
PHPで三項演算子とechoを組み合わせる基本的な使い方
三項演算子は、echo文に直接組み込んで使うことができるので、条件に応じた表示内容を一行で記述できます。
$num = 8; echo ($num >= 10) ? "10以上です" : "10未満です"; |
このコード例では、変数$numの値が10以上かどうかによって、出力される文字列が変わります。このコード例では「10未満です」と表示されます。
簡単な条件であればechoと三項演算子を組み合わせることで、コードの可読性を良くすることが可能です。
三項演算子とHTMLの併用
三項演算子は、HTMLの中にPHPを挿入するテンプレート構造でも役立ちます。特に、条件に応じてクラス名やラベルを変える処理に使うと便利です。
<?php $status = true; ?> <p class="<?php echo ($status) ? 'active' : 'inactive'; ?>">現在の状態</p> |
このコード例では、$statusの値がtrueであればクラス名がactiveになり、falseの場合はinactiveが適用されます。テンプレートエンジンを使わずにPHPを埋め込んだHTMLを書きたい場面では、三項演算子によってロジックと表示をうまく両立できます。
三項演算子とechoを組み合わせるときの注意点
三項演算子をechoと組み合わせて使う場合、カッコの省略や演算子の間違いに注意しましょう。
たとえば次のコード例では動作はしますが、他の演算子と組み合わさると優先順位の影響で意図しない出力になる場合があります。
echo $status ? '有効' : '無効'; |
意図しない動作を避けるためには、三項演算子を使う際はカッコで囲むようにしましょう。
echo ($status) ? '有効' : '無効'; |
関連記事
PHPプログラミングとは?将来性や実践で活用できるコード例など初心者にわかりやすく解説
3.PHPの三項演算子でtrueのみを記述する使い方
三項演算子を使うときに、trueの場合だけ処理を行い、falseの場合は何もしたくない場合もあるでしょう。trueのみを記述したいときに、書き方を誤ると意図しない動作を起こしてしまったり、読みづらいコードになってしまう恐れがあります。ここでは、trueのみを記述する使い方について詳しく解説します。
三項演算子でtrueのみを記述する基本的な使い方
通常の三項演算子は、trueとfalseの両方に対応した処理を記述します。
$flag = true; $result = ($flag) ? "有効" : "無効"; |
一方、trueのときだけ処理したい場合、false側には何も記述しなくてよいのでは?という発想になりそうですが、PHPでは三項演算子の構文上省略はできません。そのため、false側には「何もしない」ことを明示する必要があります。
$flag ? doSomething() : null; |
このコード例のように、false側にnullを記述することで、「何もしない」ことを明示できます。
三項演算子でtrueのみを記述するときの注意点
false側の処理をnullに見せかけるために、次のコード例のように書く人もいますが、これは避けるのが無難です。
$flag ? doSomething() : ''; |
このコードでもPHPとしてはエラーになりませんが、コードを読むときに読みにくいです。また、PHPのエラーレベルが高く設定されている場合、関数が返す型によっては、想定外の挙動になる場合も考えられます。
trueのみ記述する場合は、false側に明示的にnullを書くことをおすすめします。
三項演算子でtrueのみを記述するときに可読性を保つコツ
三項演算子でtrue側の処理だけを実行したい場合でも、省略しすぎないことがポイントです。可読性と意図の明確さを意識した記述を心がけましょう。
処理が複雑になる場合や、複数の条件が関係する場合は、無理に三項演算子を使わず、if文で明確に記述した方が安全です。
コードの読みやすさは、保守性につながります。コードが一時的に短くなったとしても、チーム開発やレビューを考えるなら、見やすさを優先することが大切です。
4.PHPの三項演算子におけるnullの使い方
PHPで変数にnullが含まれる可能性があるときに、三項演算子を使うのは注意しましょう。想定通りに評価されない場合や、未定義の変数を扱ってエラーが発生する恐れがあります。ここでは、nullを意識した三項演算子の使い方と、null合体演算子との違いを解説します。
nullを返す可能性のある変数に対する三項演算子の使い方
変数がnullであるかどうかを判断し、その結果によって表示や処理を切り替えたい場面があります。たとえば、次のようなケースです。
echo ($value !== null) ? $value : "デフォルト値"; |
このコード例は、変数$valueがnullでなければそのまま表示し、そうでなければ「デフォルト値」と表示します。比較演算子(!==)を使って明示的にnullと比較することで、意図しない挙動を防いだ処理が可能です。nullかどうかを判断したいだけであれば、null合体演算子を使う方法もあります。
null合体演算子(??)との違いと使い方
PHP 7.0以降では、null合体演算子である「??」が導入され、null判定がより直感的に書けるようになりました。
$value = $_GET['id'] ?? '未指定';
|
このコード例は、「$_GET['id']が定義されていて、かつnullでなければその値を、そうでなければ '未指定' を代入するという処理を記述しています。同じ処理を三項演算子で記述すると次のようになります。
$value = isset($_GET['id']) ? $_GET['id'] : '未指定';
|
どちらも動作は似ていますが、??を使うと未定義の変数やnullの両方を対象にできる点が大きなメリットです。また、コードも短くなります。
PHPの三項演算子とissetを組み合わせた使い方
三項演算子でnullを使う場合、未定義の変数によるエラーを避けるためには、isset()関数と組み合わせるのがおすすめです。
echo isset($user['name']) ? $user['name'] : '名前未登録'; |
このコード例のように書くことで、$user['name']が未定義だった場合でもエラーにならず、代わりに「名前未登録」と表示されます。
ただし、PHP 7以上を使っている場合は、前述の通りnull合体演算子(??)を使う方がシンプルです。isset()を使う三項演算子はPHP 5系でも動作するため、バージョン互換性を重視する場合には依然として有効な選択肢です。
関連記事
PHPでできること・できないことを解説!初心者でも作れるものや学習方法も紹介
5. PHPの三項演算子ではてな 2つが登場するネスト構文の使い方
PHPのコードを読んでいて、はてな2つが連続して
三項演算子の中にもう一つ三項演算子がある」という複雑な構文に出会うことがあります。特に、はてなが2つ連続して現れるケースでは、初心者にとって読み解くのが難しくなる傾向があります。この章では、三項演算子のネストの仕組みと、読みやすく保つための工夫を紹介します。
三項演算子のネスト構文とは?
三項演算子をネストするとは入れ子にするという意味です。三項演算子のtrueまたはfalse側に、さらに別の三項演算子を入れ子にして記述することを指します。
$score = 85; echo ($score >= 90) ? "優秀" : (($score >= 70) ? "合格" : "不合格"); |
このコード例では、スコアが90以上なら「優秀」、70以上なら「合格」、それ以外は「不合格」と表示します。一行に収まっているため見た目はスッキリしていますが、構文を理解していないと意味が取りづらいでしょう。
特に「?」や「:」が2つ登場すると、どの条件がどの処理に対応しているのか判断しづらくなってしまいます。
ネストされた三項演算子をわかりやすく書き換える方法
ネストされた三項演算子が読みにくくなる理由は、処理の分岐が直感的に追えない構造になってしまうからです。3つ以上の条件がネスト構造になると、さらに混乱しやすくなります。
$level = ($num > 90) ? 'A' : (($num > 75) ? 'B' : (($num > 60) ? 'C' : 'D')); |
このような場合は、三項演算子ではなくif文に書き換えることで、かなりわかりやすくなるでしょう。
if ($num > 90) { $level = 'A'; } elseif ($num > 75) { $level = 'B'; } elseif ($num > 60) { $level = 'C'; } else { $level = 'D'; } |
コードの可読性は、保守性に大きく関係しますので、三項演算子にこだわらず誰が読んでも理解しやすいコードにしてください。バグの防止にもつながります。
三項演算子のネストが必要な場合のコツ
たとえばコードを短くまとめたい理由があるなど、どうしても三項演算子のネストが必要な場合にはどうすればよいでしょう。
そのような場合には、次のコード例のように工夫してみましょう。
echo ($status === 'admin') ? '管理者' : (($status === 'user') ? '一般ユーザー' : 'ゲスト'); |
インデントを整えたり、カッコを丁寧に使ったりすることで、ネスト構造でもコードの可読性が上がります。
また、PHP 8.0以降で導入されたmatch式を使うと、複数条件の分岐をより読みやすく書くことも可能です。ただし、バージョンに依存するため注意してください。
関連記事
6.PHPの三項演算子で複数条件を使う方法
PHPで複数の条件分岐を記述する場合、三項演算子を使えばコードを短くまとめられます。その一方で、条件が増えるほど構文が複雑になり、読みづらくなりバグの原因にもつながります。ここでは、複数条件を三項演算子で安全に扱うための考え方と、読みやすさを保つコツを解説します。
複数条件を三項演算子で表現する方法
三項演算子で複数の条件を扱いたい場合は、条件式の中に論理演算子を組み込むと良いでしょう。たとえば、年齢が20歳以上かつ「会員」である場合に「参加可能」と表示したい場合は、次のように書きます。
$isMember = true; echo ($age >= 20 && $isMember) ? "参加可能" : "参加不可"; |
このコード例のように、条件部分に複数の判定を組み込むことで、1行で複雑な条件処理が可能です。ただし、条件が増えるほど構文が長くなり、可読性は下がるので注意しなければいけません。
論理演算子(AND・OR)と併用する
複数条件を扱う際には、&&(AND)や ||(OR)といった論理演算子の意味を正しく理解して使い分けることが重要です。
「&&」はすべての条件が真のときにtrueであり、「||」はいずれかの条件が真ならtrueです。
たとえば、年齢が20歳以上または学生であれば「割引対象」にする条件は次のコードをご参照ください。
$isStudent = true; echo ($age >= 20 || $isStudent) ? "割引対象" : "対象外"; |
条件が増えた場合にわかりやすく書き換える方法
条件が3つ以上になった場合、三項演算子を使い続けるとかなり読みにくいコードになってしまいます。条件が3つ以上に増えた場合にはif文に書き換えましょう。
if ($age >= 20 && $isMember && !$isBanned) { $status = "参加可能"; } else { $status = "参加不可"; } |
7.PHPの三項演算子でバージョンに関する注意点
PHPの三項演算子は長い間使われている構文ですが、バージョンによって挙動に微妙な違いがあるので注意してください。また、PHP 7以降ではnull合体演算子(??)が登場し、記述方法の選択肢が増えました。ここでは、三項演算子のバージョンに関する注意点を解説します。
PHPのバージョンによる三項演算子の挙動の違い
三項演算子自体はPHP 4から存在しており、構文そのものは現在でも変わっていません。ただし、PHP 5.3まではネストした三項演算子の評価順に関する挙動が曖昧で、意図しない結果になることがありました。
PHP 5.4以降では、左から順に評価される仕様に統一されました。コードの可読性は高まりましたが、評価の順序が読みづらくなるコードは避けるのが良いでしょう。
PHP 7以降で追加されたnull合体演算子との関係
PHP 7.0から導入されたnull合体演算子(??)は、三項演算子やisset()を使った判定を、よりシンプルに記述できるのでおすすめです。
$username = $_POST['username'] ?? 'ゲスト'; |
このコード例では、$_POST['username']が未定義またはnullの場合に「ゲスト」を代入するという意味を表しています。
null合体演算子が登場する以前は、次のコード例のように書いていました。
$username = isset($_POST['username']) ? $_POST['username'] : 'ゲスト'; |
このコードでも問題ありませんが、PHP 7以上の環境では、??を使ったほうがよりシンプルでわかりやすいコードにまとめることができます。ただし、null合体演算子は三項演算子の代替ではなく、あくまでも「未定義かつnullかどうか」を評価する専用の構文であることを理解しておきましょう。
8.PHPにおける三項演算子の実践コード例
ここまでの内容を踏まえて、.PHPで使える三項演算子の実践コード例を紹介します。
数値比較で表示を切り替えるコード例
ここまでにもコード例として紹介していますが、数値の大小に応じて表示内容を切り替える処理に三項演算子は便利です。
$result = ($num >= 80) ? "合格" : "不合格"; echo $result; |
このコードでは、$numが80以上なら「合格」、それ以外なら「不合格」と表示します。
if文で書くと3〜4行かかる処理が、1行で書けるため、読みやすさと効率を両立できるのでおすすめのコード例です。
配列(array)と三項演算子を組み合わせたコード例
配列から特定の値を取り出し、存在するかどうかで処理を分けたい場合にも三項演算子は役立ちます。
echo isset($user['name']) ? $user['name'] : '名無し'; |
このコード例では、配列のキーが存在していればその値を出力し、なければ「名無し」を表示します。PHP 7以上であれば、次のコード例のように、さらにシンプルに記述することも可能です。
echo $user['name'] ?? '名無し'; |
関数内でのreturnと三項演算子を組み合わせたコード例
return文と三項演算子を組み合わせれば、関数内の分岐処理もすっきりとまとめられます。状態判定やステータス表示といったシンプルな戻り値を返す関数に便利です。
function getStatusMessage($isActive) { return $isActive ? "有効" : "無効"; } |
関連記事
PHP配列完全ガイド|初期化・追加・要素数・操作から配列操作・連想配列まで徹底解説
9.PHPの三項演算子でよくあるエラー
PHPの三項演算子は構文がシンプルな一方で、カッコや優先順位のミスが原因でエラーが発生することがあります。ここでは、よくあるエラーとその対処法を紹介します。
構文エラー
構文エラーは三項演算子だけに限ったエラーではありませんが、三項演算子を使ったときに条件式や式の括弧を省略したまま書いた場合起こることがあります。カッコをつけることでPHPの構文解析が正しく行われ、意図通りの動作になりますので、構文エラーを避けるために明示的にカッコをつけることをおすすめします。
echo ($isAdmin) ? "管理者" : "一般"; |
true/falseにおける評価の誤解
三項演算子を使った条件式で数値や文字列を使う場合、型の違いによる評価の誤解に注意が必要です。
$value = 0; echo ($value) ? "TRUE" : "FALSE"; // 出力:FALSE |
このコード例のように、PHPにおいて「0」falseと評価されるため、出力は「FALSE」になります。他にも、空文字("")やnullなどもFALSEと判定されます。意図通りの結果にならない場合は、厳密な比較(===)を使うようにしましょう。
複雑な条件におけるカッコの使い方
三項演算子をネストしたり、論理演算子と組み合わせたりすると、優先順位によって想定外の結果になることがあります。
好ましくないコード例
echo $score > 80 ? "優秀" : $score > 60 ? "普通" : "要改善"; |
読みにくく、バグの温床になってしまうので、カッコを明示的に追加して評価の順序を明確にしてください。
echo ($score > 80) ? "優秀" : (($score > 60) ? "普通" : "要改善"); |
だらだらと長いコードよりは、シンプルにすっきりまとまったコードのほうが好ましいですが、可読性を犠牲にしてまで短く書く必要はありません。他の人が読んだときに理解できる構造を意識しましょう。
関連記事
PHP技術者認定試験とは?合格率や難易度、初級・上級の特徴、勉強時間を含む学習方法を解説
10.まとめ
本記事では、PHPの三項演算子について、基本構文から応用的な使い方、バージョンごとの注意点やエラー対策まで幅広く解説しました。if文との違いや、複雑な条件式での使い分けの判断ポイントもご紹介しました。
コードをよりシンプルに、わかりやすく書きたいと考えているエンジニアにとって、三項演算子は強力な味方になるはずです。日々の開発やコードレビューの中で、適切な使いどころを意識してぜひ活用してみてください。
本記事が皆様にとって少しでもお役に立てますと幸いです。
「フリーランスボード」は、数多くのフリーランスエージェントが掲載するITフリーランスエンジニア・ITフリーランス向けの案件・求人を一括検索できるサイトです。
開発環境、職種、単価、稼働形態、稼働日数など様々な条件から、あなたに最適なフリーランス案件・求人を簡単に見つけることができます。
単価アップを目指す方や、自分の得意なスキルを活かせる案件に参画したい方は、ぜひ「フリーランスボード」をご利用ください。
自身に最適なフリーランスエージェントを探したい方はこちらよりご確認いただけます。