PHPの三項演算子とは、条件によって2つの値のうち、どちらか一方を選択するための演算子です。
単純な条件分岐であれば、if〜elseよりも短く記述できるため、PHPのプログラムやWebページのテンプレートなどでよく利用されます。
三項演算子の基本的な構文は、次のとおりです。
条件式 ? 条件がtrueの場合の値 : 条件がfalseの場合の値
例えば、年齢によって「成人」と「未成年」を切り替える場合は、次のように記述できます。
$age = 20;
$result = $age >= 18 ? '成人' : '未成年';
echo $result;
この場合、$age >= 18という条件はtrueになるため、$resultには'成人'が代入されます。
三項演算子は、単純にif〜elseを短くした構文というより、条件に応じて2つの式のどちらかを評価し、その結果を値として返す演算子と理解すると正確です。
PHPの三項演算子の基本的な書き方
三項演算子の基本構文
PHPの三項演算子は、次の3つの要素から構成されています。
$condition ? $value1 : $value2;
それぞれの意味は次のとおりです。
$condition:判定する条件式$value1:条件がtrueの場合に返す値$value2:条件がfalseの場合に返す値
例えば、テストの点数によって合否を判断する場合は、次のように書けます。
$score = 80;
$result = $score >= 60 ? '合格' : '不合格';
echo $result;
$score >= 60がtrueなので、結果は次のようになります。
合格
if〜elseで書いた場合との違い
同じ処理をif〜elseで記述すると、次のようになります。
$score = 80;
if ($score >= 60) {
$result = '合格';
} else {
$result = '不合格';
}
echo $result;
三項演算子を使用すると、次のように簡潔にできます。
$result = $score >= 60 ? '合格' : '不合格';
処理内容が単純な2択であれば、三項演算子を使うことでコード量を減らせます。
一方、条件分岐の中で複数の処理を実行する場合や、条件が複雑な場合はif〜elseを使用したほうが読みやすくなります。
PHPの三項演算子の使い方
条件によって文字列を切り替える
三項演算子の代表的な使い方は、条件に応じて表示する文字列を切り替える方法です。
$isLoggedIn = true;
$message = $isLoggedIn ? 'ログイン中です' : 'ログインしてください';
echo $message;
$isLoggedInがtrueであるため、実行結果は次のとおりです。
ログイン中です
ログイン状態や公開状態、会員状態などによって表示内容を変更するときに利用できます。
数値の条件によって値を切り替える
数値を比較した結果によって値を変更することもできます。
$temperature = 30;
$status = $temperature >= 25 ? '暑い' : '涼しい';
echo $status;
30 >= 25はtrueになるため、'暑い'が返されます。
暑い
年齢、価格、点数、在庫数など、数値による単純な条件分岐で使いやすい方法です。
真偽値によって状態を切り替える
trueまたはfalseが入った変数をそのまま条件として使用することもできます。
$isPublished = false;
$status = $isPublished ? '公開中' : '非公開';
echo $status;
この場合、$isPublishedはfalseなので、
非公開
と表示されます。
PHPの三項演算子をHTMLで使う方法
HTML内で表示内容を変更する
PHPはWeb開発で利用されることが多いため、HTML内でも三項演算子がよく使われます。
例えば、会員かどうかによって表示内容を切り替える場合は次のように記述できます。
<?php $isMember = true; ?>
<p>
<?= $isMember ? '会員メニュー' : 'ゲストメニュー' ?>
</p>
$isMemberがtrueなので、HTMLには次の内容が表示されます。
会員メニュー
<?= ... ?>はPHPの短縮echo構文であり、式の結果を出力するときに便利です。
CSSクラスを切り替える
条件によってHTML要素のCSSクラスを変更する場合にも便利です。
<?php $isActive = true; ?>
<div class="<?= $isActive ? 'active' : 'inactive' ?>">
コンテンツ
</div>
$isActiveがtrueの場合、出力されるHTMLは次のようになります。
<div class="active">
コンテンツ
</div>
ナビゲーションの現在位置や、ボタンの状態、エラー表示などを切り替える場合に利用できます。
PHPの三項演算子の省略形「?:」とは
三項演算子は中央部分を省略できる
PHPでは、三項演算子のtrue側の式を省略した書き方もできます。
通常は次のように書きます。
$result = $name ? $name : 'ゲスト';
これを省略すると、次のように記述できます。
$result = $name ?: 'ゲスト';
基本的には、
式 ?: falseの場合の値
という形になります。
左側の式が真として評価されれば、その値自体が返されます。
偽として評価された場合は、:の右側にある値が返されます。
「?:」の使用例
例えば、名前が設定されている場合はその名前を使い、設定されていなければ「ゲスト」としたい場合があります。
$name = '田中';
$result = $name ?: 'ゲスト';
echo $result;
結果は、
田中
になります。
一方、空文字列の場合は次のようになります。
$name = '';
$result = $name ?: 'ゲスト';
echo $result;
結果は、
ゲスト
です。
PHPでfalseとして扱われる値に注意する
「?:」はnullだけを判定するわけではない
三項演算子の省略形?:を使用するときは、PHPにおける真偽値の判定に注意する必要があります。
PHPでは、代表的に次のような値がfalseとして扱われます。
false
0
0.0
''
'0'
[]
null
そのため、例えば次のコードでは注意が必要です。
$value = 0;
$result = $value ?: 100;
echo $result;
結果は、
100
になります。
$valueには0という値が設定されていますが、PHPでは0が偽として評価されるためです。
文字列の「0」もfalseとして扱われる
PHPでは文字列の'0'も偽として評価されます。
$value = '0';
$result = $value ?: '未設定';
echo $result;
結果は、
未設定
になります。
0や'0'を有効な値として扱いたい場合は、三項演算子の省略形ではなくNull合体演算子??が適しているケースがあります。
PHPの三項演算子とNull合体演算子「??」の違い
Null合体演算子とは
PHPには、??というNull合体演算子があります。
例えば、次のように使用します。
$name = $_GET['name'] ?? 'ゲスト';
これは、$_GET['name']が存在し、かつnullではない場合はその値を使用し、それ以外の場合は'ゲスト'を使用するという意味です。
典型的には、次のようなisset()を利用した処理を簡潔に記述できます。
if (isset($_GET['name'])) {
$name = $_GET['name'];
} else {
$name = 'ゲスト';
}
「?:」と「??」では判定方法が異なる
次の2つは見た目が似ています。
$result = $value ?: 'デフォルト値';
$result = $value ?? 'デフォルト値';
しかし、判定の仕組みは異なります。
?:は、左側の値を真偽値として評価します。
そのため、0、空文字列、falseなどの場合も右側の値が選択されます。
一方、??は基本的に左側の値が存在し、かつnullではないかを判定します。
例えば次のコードがあります。
$value = 0;
$result1 = $value ?: 100;
$result2 = $value ?? 100;
echo $result1;
echo $result2;
$result1は次の値になります。
100
一方、$result2は次の値になります。
0
0は偽として評価されるため?:ではデフォルト値が返りますが、0自体はnullではないため、??ではそのまま利用されます。
デフォルト値を設定するときは、この違いを理解しておくことが重要です。
PHPの三項演算子を関数で使う方法
return文と組み合わせる
三項演算子は値を返す式なので、関数のreturn文とも組み合わせられます。
function getResult(int $score): string
{
return $score >= 60 ? '合格' : '不合格';
}
echo getResult(80);
結果は、
合格
です。
単純な条件によって戻り値を変更する関数であれば、簡潔に記述できます。
echoで直接出力する
変数へ代入せず、三項演算子の結果を直接echoで出力することもできます。
$stock = 5;
echo $stock > 0 ? '在庫あり' : '在庫なし';
結果は、
在庫あり
となります。
短い表示処理では便利ですが、条件式が複雑になる場合は変数へ分けたほうが読みやすくなります。
PHPの三項演算子をネストするときの注意点
三項演算子を組み合わせることはできる
複数の条件を扱うために、三項演算子の中に別の三項演算子を書くこともできます。
例えば次のようなコードです。
$score = 70;
$result = $score >= 80
? '優秀'
: ($score >= 60 ? '合格' : '不合格');
echo $result;
$scoreは70なので、結果は、
合格
となります。
PHP 8.0以降では括弧なしの連続使用に注意する
PHP 8.0以降では、三項演算子は非結合として扱われます。
そのため、次のように括弧を付けずに三項演算子を連続して記述することはできません。
$result = true ? 0 : true ? 1 : 2;
複数の三項演算子を組み合わせる場合は、括弧を使って評価順序を明確にします。
$result = true ? 0 : (true ? 1 : 2);
ただし、三項演算子を何重にもネストすると可読性が低下しやすくなります。
複数の条件を扱う場合は、if〜elseif〜elseやmatchの使用も検討したほうがよいでしょう。
PHPの三項演算子とmatch式の違い
PHP 8.0以降ではmatch式も利用できる
PHP 8.0以降では、複数の値から結果を選択する場合にmatch式を利用できます。
例えば、ステータス番号によって表示内容を変更する場合は次のように書けます。
$status = 1;
$message = match ($status) {
1 => '受付中',
2 => '処理中',
3 => '完了',
default => '不明',
};
echo $message;
結果は、
受付中
となります。
三項演算子とmatchを使い分ける
三項演算子は、次のような単純な2択に向いています。
$status = $isPublished ? '公開' : '非公開';
一方、1つの値を複数の候補と比較して結果を切り替える場合は、matchが分かりやすいことがあります。
例えば、
$message = match ($status) {
1 => '受付中',
2 => '処理中',
3 => '完了',
default => '不明',
};
という形です。
また、matchでは値の比較に厳密な比較に相当する判定が使われます。
単純な2択では三項演算子、複数の値による分岐ではmatch、複雑な処理を伴う条件分岐ではif〜elseif〜elseと使い分けると、読みやすいコードを書きやすくなります。
PHPの三項演算子を使うメリット
コードを簡潔にできる
三項演算子を使う大きなメリットは、単純な条件分岐を短く書けることです。
例えば、次のコードがあります。
if ($isAdmin) {
$role = '管理者';
} else {
$role = '一般ユーザー';
}
三項演算子を使うと、次の1行にまとめられます。
$role = $isAdmin ? '管理者' : '一般ユーザー';
条件と結果が単純であれば、コード全体を把握しやすくなります。
変数への代入と相性がよい
三項演算子は式として値を返すため、そのまま変数へ代入できます。
$message = $isSuccess ? '成功しました' : '失敗しました';
わざわざ条件分岐ごとに代入処理を書く必要がありません。
HTMLテンプレートで使いやすい
Webページでは、CSSクラスや表示テキストなどの短い切り替えが頻繁に発生します。
例えば、
<?= $isActive ? 'active' : '' ?>
のように記述すれば、条件に応じてCSSクラスを簡単に出力できます。
このような単純な表示切り替えは、三項演算子が特に便利な場面です。
PHPの三項演算子を使う際の注意点
コードを短くすることだけを目的にしない
三項演算子はコードを短くできますが、必ずしも短いコードが読みやすいとは限りません。
例えば次のようなコードです。
$result = $a
? ($b ? 'A' : 'B')
: ($c ? 'C' : 'D');
動作自体は理解できますが、条件が増えるほど処理の流れを把握しにくくなります。
このような場合は、if〜elseを使用したほうが保守しやすくなることがあります。
複雑な条件式は変数に分ける
次のように、条件式が長くなる場合もあります。
$result = $age >= 18 && $hasPermission && $isActive
? '利用可能'
: '利用不可';
条件自体に意味がある場合は、変数へ分けると読みやすくなります。
$canUseService = $age >= 18 && $hasPermission && $isActive;
$result = $canUseService ? '利用可能' : '利用不可';
$canUseServiceという変数名を見るだけで条件の目的を把握できるため、後からコードを読む人にも分かりやすくなります。
「?:」と「??」を混同しない
デフォルト値を設定する場合に特に注意したいのが、?:と??の違いです。
例えば、
$count = 0;
$result = $count ?: 10;
では、
10
になります。
一方、
$count = 0;
$result = $count ?? 10;
では、
0
になります。
0や空文字列を有効なデータとして扱うプログラムでは、この違いによって意図しない結果になる可能性があります。
PHPの三項演算子はどのような場面で使うべきか
単純な2択の条件分岐に向いている
三項演算子は、1つの条件によって2つの値からどちらか一方を選択する処理に適しています。
例えば、
$label = $isPublished ? '公開中' : '非公開';
のようなコードです。
特に、次のような場面で利用しやすいでしょう。
- 条件によって表示する文字列を変更する
- 真偽値によって状態を切り替える
- CSSクラスを切り替える
- ボタンのラベルを変更する
- 関数の戻り値を変更する
- HTMLテンプレート内で短い表示分岐を行う
コードを見ただけで条件と結果をすぐ理解できる場合は、三項演算子を使うメリットがあります。
複雑な処理にはif文などを使う
複数の条件が複雑に絡む場合や、それぞれの条件で複数行の処理を行う場合は、無理に三項演算子を使用する必要はありません。
そのような場合は、
if
elseif
else
や、
match
などを利用したほうが、コードの意図が明確になります。
重要なのは、コードをできるだけ短くすることではなく、後から読んでも処理内容を理解しやすい状態にすることです。
PHPの三項演算子についてのまとめ
PHPの三項演算子は、条件に応じて2つの値のどちらか一方を選択するための演算子です。
基本構文は次のとおりです。
条件式 ? trueの場合の値 : falseの場合の値
例えば、
$age = 20;
$result = $age >= 18 ? '成人' : '未成年';
と記述すれば、単純な条件分岐を簡潔に表現できます。
また、PHPでは次のような省略形も利用できます。
$value ?: 'デフォルト値';
ただし、?:では0、空文字列、falseなども偽として判定されるため注意が必要です。
nullや未定義の場合だけデフォルト値を使用したい場合には、Null合体演算子を利用できます。
$value ?? 'デフォルト値';
さらに、PHP 8.0以降では三項演算子が非結合となっているため、複数の三項演算子を連続して使用する場合は括弧で評価順序を明示する必要があります。
三項演算子は、単純な2択では非常に便利な構文です。
一方、条件が複雑になった場合はif〜elseやmatchを利用し、読みやすさを優先することが重要です。
以上、PHPの三項演算子とは何か、書き方や使い方についてでした。
最後までお読みいただき、ありがとうございました。










