PHPのエルビス演算子とは
PHPで一般に「エルビス演算子」と呼ばれている?:は、三項演算子の短縮形です。
基本的な構文は次のとおりです。
$value ?: $default;
左辺の$valueがTruthyと評価された場合は、その評価結果が返されます。
一方、Falsyと評価された場合は、右辺の$defaultが返されます。
例えば、次のように記述できます。
$name = $inputName ?: 'ゲスト';
$inputNameに'田中'などのTruthyな値が入っていれば、その値が使用されます。
一方、空文字列などのFalsyな値であれば、'ゲスト'が使用されます。
三項演算子を短縮した記法
通常の三項演算子は、次のように記述します。
$result = $value ? $value : $default;
エルビス演算子を使用すると、次のように短く書けます。
$result = $value ?: $default;
左辺の値をそのまま返したい場合に、同じ変数や式を繰り返し記述しなくて済むのが特徴です。
PHPのエルビス演算子の基本的な使い方
エルビス演算子は、値がFalsyだった場合にデフォルト値を設定したい場面で便利です。
文字列にデフォルト値を設定する
例えば、ユーザー名が入力されていない場合に「ゲスト」と表示したいとします。
$username = $name ?: 'ゲスト';
$nameが次のような値なら、
$name = '田中';
結果は、
田中
となります。
一方、
$name = '';
の場合は、空文字列がFalsyと評価されるため、
ゲスト
となります。
数値にデフォルト値を設定する
数値でもエルビス演算子を使用できます。
$number = $count ?: 10;
ただし、PHPでは数値の0がFalsyと評価される点に注意が必要です。
例えば、
$count = 0;
$result = $count ?: 10;
とすると、$resultには10が入ります。
そのため、0を正しい値として残したい場合には、エルビス演算子が適していないケースがあります。
エルビス演算子でFalsyと判定される値
エルビス演算子を正しく使うためには、PHPでどのような値がFalsyとして扱われるのか理解しておくことが重要です。
代表的なFalsyな値には、次のものがあります。
false
0
0.0
''
'0'
[]
null
これらが左辺に指定されると、エルビス演算子では右辺の値が使用されます。
0はFalsyとして扱われる
例えば、次のコードを見てみましょう。
$quantity = 0;
$result = $quantity ?: 10;
この場合、0はFalsyなので、$resultには10が入ります。
「数量0」など、0自体に意味があるデータを扱う場合には注意が必要です。
文字列の「0」もFalsyになる
PHPでは、文字列の'0'もFalsyとして評価されます。
$value = '0';
$result = $value ?: '未入力';
この場合、結果は次のようになります。
未入力
フォームから送信された数値が文字列として扱われるケースもあるため、Webフォームの処理では特に注意が必要です。
空配列もFalsyとして扱われる
空の配列もFalsyです。
$items = [];
$result = $items ?: ['商品なし'];
この場合、$resultには次の配列が入ります。
['商品なし']
一方、配列に要素が入っていれば、その配列がそのまま使用されます。
$items = ['りんご', 'みかん'];
$result = $items ?: ['商品なし'];
エルビス演算子と通常の三項演算子の違い
通常の三項演算子は、条件に応じて任意の2つの値を切り替えるために使用します。
通常の三項演算子
三項演算子の基本構文は次のとおりです。
条件 ? 真の場合の値 : 偽の場合の値;
例えば、
$age = 20;
$message = $age >= 18 ? '成人です' : '未成年です';
と記述できます。
この場合は、$age >= 18という条件式を評価しています。
エルビス演算子
エルビス演算子は、左辺そのものを条件として評価します。
$name = '山田';
$result = $name ?: 'ゲスト';
$nameがTruthyなので、$resultには'山田'が入ります。
つまり、通常の三項演算子は自由な条件式を指定したい場合に向いており、エルビス演算子は「左辺の値を使うか、代替値を使うか」を簡潔に書きたい場合に向いています。
エルビス演算子とNull合体演算子の違い
PHPには、エルビス演算子と似た用途で使われるNull合体演算子??があります。
両者は似ていますが、判定条件が大きく異なります。
エルビス演算子はFalsyを判定する
エルビス演算子は次のように記述します。
$value ?: 'default';
左辺がFalsyなら、右辺の値が使用されます。
そのため、
$value = 0;
$result = $value ?: 100;
では、結果は100になります。
Null合体演算子はnullや未定義を判定する
Null合体演算子は、次のように記述します。
$value ?? 'default';
左辺がnull、または未定義の場合に右辺が使用されます。
例えば、
$value = 0;
$result = $value ?? 100;
では、0はnullではないため、結果は0です。
エルビス演算子とNull合体演算子の比較
両者の違いをまとめると、次のようになります。
| 左辺の値 | $value ?: 'default' | $value ?? 'default' |
|---|---|---|
'PHP' | 'PHP' | 'PHP' |
0 | 'default' | 0 |
'0' | 'default' | '0' |
'' | 'default' | '' |
false | 'default' | false |
[] | 'default' | [] |
null | 'default' | 'default' |
「Falsyな値をまとめて代替値へ置き換えたい場合」は?:、
「nullや未定義の場合だけ代替値を使用したい場合」は??と考えると使い分けやすくなります。
未定義変数ではNull合体演算子が便利
エルビス演算子では、左辺の式そのものが評価されます。
例えば、未定義変数に対して、
$name = $undefinedName ?: 'ゲスト';
とすると、未定義変数に関する警告が発生する可能性があります。
一方、Null合体演算子なら、
$name = $undefinedName ?? 'ゲスト';
と記述できます。
左辺が未定義でもデフォルト値を使用できるため、フォームや配列から値を取得する処理で便利です。
GETパラメータを取得する場合
例えば、URLのパラメータから名前を取得する場合は、次のように記述できます。
$name = $_GET['name'] ?? 'ゲスト';
nameが存在すればその値を使用し、存在しなければ'ゲスト'を使用します。
ただし、
$_GET['name'] = '';
のように空文字列が入っている場合、??では空文字列がそのまま使用されます。
空文字列もデフォルト値へ置き換えたい場合には、別途条件を考える必要があります。
関数の戻り値にエルビス演算子を使う
エルビス演算子は、変数だけでなく関数の戻り値にも使用できます。
function getUserName()
{
return '';
}
$name = getUserName() ?: 'ゲスト';
echo $name;
getUserName()が空文字列を返しているため、結果は次のようになります。
ゲスト
設定値のフォールバックにも使える
例えば、設定値を取得する関数がFalsyな値を返した場合に、デフォルト値を使用できます。
$title = getTitle() ?: 'タイトル未設定';
簡単なフォールバック処理を1行で記述できるのがメリットです。
エルビス演算子を複数つなげる方法
短縮三項演算子?:は、複数の候補を順番に評価する用途にも使用できます。
例えば、
$name = $nickname ?: $username ?: 'ゲスト';
と記述できます。
最初のTruthyな値が使用される
例えば、
$nickname = '';
$username = 'tanaka';
$name = $nickname ?: $username ?: 'ゲスト';
の場合、$nicknameはFalsyですが、$usernameはTruthyです。
そのため、$nameには次の値が入ります。
tanaka
複数の候補から最初に利用可能な値を選びたい場合に便利です。
ただし、何段も連続させると可読性が低下するため、複雑な条件ではif文などに分けたほうが理解しやすくなる場合があります。
エルビス演算子を使うメリット
エルビス演算子には、コードを簡潔に書けるという大きなメリットがあります。
条件分岐を短く書ける
例えば、次の処理を考えてみましょう。
if ($name) {
$displayName = $name;
} else {
$displayName = 'ゲスト';
}
エルビス演算子なら、次の1行にまとめられます。
$displayName = $name ?: 'ゲスト';
単純なデフォルト値の設定であれば、コードを短くしつつ処理の意図も表現できます。
同じ値を繰り返し記述する必要がない
通常の三項演算子では、
$displayName = $name ? $name : 'ゲスト';
のように$nameを2回記述します。
エルビス演算子なら、
$displayName = $name ?: 'ゲスト';
と書けるため、より簡潔です。
PHPのエルビス演算子を使う際の注意点
便利な演算子ですが、Falsyな値にも意味があるデータを扱う場合には注意が必要です。
0を有効な値として扱う場合
例えば、商品の在庫数が0だった場合を考えてみましょう。
$stock = 0;
$displayStock = $stock ?: '在庫不明';
この場合、結果は、
在庫不明
になります。
しかし、本来は「在庫数0」という重要な情報かもしれません。
このような場合には、
$displayStock = $stock ?? '在庫不明';
など、目的に適した判定方法を選ぶ必要があります。
falseに意味がある場合も注意する
例えば、設定値としてfalseが有効なデータであるケースがあります。
$enabled = false;
$result = $enabled ?: true;
この場合、falseがFalsyなので、$resultはtrueになります。
false自体を有効な値として保持したい場合には、エルビス演算子は適していません。
短く書くことを優先しすぎない
例えば、
$a ?: $b ?: $c ?: $d ?: $e;
のように大量の候補をつなげると、コードの意図を把握しにくくなることがあります。
処理が複雑になった場合には、ifやelseifを使って明示的に条件分岐したほうが、保守しやすいコードになる場合があります。
エルビス演算子とNull合体演算子の使い分け
実務では、「どの値をデフォルト値へ置き換えたいのか」を基準に選ぶことが重要です。
Falsyな値を置き換えるならエルビス演算子
次のような値をまとめてデフォルト値へ置き換えたい場合には、エルビス演算子が適しています。
false
0
0.0
''
'0'
[]
null
例えば、
$title = $title ?: 'タイトル未設定';
と記述できます。
nullや未定義だけを置き換えるならNull合体演算子
0や空文字列、falseなどは正しい値として残し、nullや未定義の場合だけデフォルト値を使用したいのであれば、Null合体演算子が適しています。
$value = $value ?? 'default';
WebフォームやAPI、データベースから取得する値では、0やfalseに意味がある場合も多いため、両者の違いを理解したうえで選ぶことが重要です。
PHPのエルビス演算子の使用例
代表的な使用例をまとめると、次のようになります。
文字列のデフォルト値
$name = $username ?: 'ゲスト';
数値のデフォルト値
$number = $count ?: 10;
配列のデフォルト値
$items = $products ?: ['商品なし'];
関数の戻り値
$title = getTitle() ?: 'タイトル未設定';
複数候補から値を選ぶ
$name = $nickname ?: $username ?: 'ゲスト';
PHPのエルビス演算子についてのまとめ
PHPのエルビス演算子?:は、三項演算子の短縮形です。
$value ?: $default;
と記述することで、左辺がTruthyならその値を使用し、Falsyなら右辺の値を使用できます。
デフォルト値を簡潔に設定できる便利な記法ですが、0、'0'、空文字列、false、空配列、nullなどもFalsyとして扱われる点には注意が必要です。
一方、Null合体演算子??は、基本的にnullまたは未定義の場合にデフォルト値を使用します。
そのため、使い分けの基本は次のように考えると分かりやすいでしょう。
Falsyな値をまとめて代替値へ置き換えたい場合は?:を使用します。
nullや未定義の場合だけ代替値を使用したい場合は??を使用します。
それぞれの判定方法の違いを理解しておくことで、意図しない0やfalseの置き換えを防ぎ、より安全で読みやすいPHPコードを書けるようになります。
以上、PHPのエルビス演算子の使い方についてでした。
最後までお読みいただき、ありがとうございました。










