PHPのエルビス演算子の使い方について

採用はこちら

目次

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;

では、0nullではないため、結果は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なので、$resulttrueになります。

false自体を有効な値として保持したい場合には、エルビス演算子は適していません。

短く書くことを優先しすぎない

例えば、

$a ?: $b ?: $c ?: $d ?: $e;

のように大量の候補をつなげると、コードの意図を把握しにくくなることがあります。

処理が複雑になった場合には、ifelseifを使って明示的に条件分岐したほうが、保守しやすいコードになる場合があります。

エルビス演算子とNull合体演算子の使い分け

実務では、「どの値をデフォルト値へ置き換えたいのか」を基準に選ぶことが重要です。

Falsyな値を置き換えるならエルビス演算子

次のような値をまとめてデフォルト値へ置き換えたい場合には、エルビス演算子が適しています。

false
0
0.0
''
'0'
[]
null

例えば、

$title = $title ?: 'タイトル未設定';

と記述できます。

nullや未定義だけを置き換えるならNull合体演算子

0や空文字列、falseなどは正しい値として残し、nullや未定義の場合だけデフォルト値を使用したいのであれば、Null合体演算子が適しています。

$value = $value ?? 'default';

WebフォームやAPI、データベースから取得する値では、0falseに意味がある場合も多いため、両者の違いを理解したうえで選ぶことが重要です。

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や未定義の場合だけ代替値を使用したい場合は??を使用します。

それぞれの判定方法の違いを理解しておくことで、意図しない0falseの置き換えを防ぎ、より安全で読みやすいPHPコードを書けるようになります。

以上、PHPのエルビス演算子の使い方についてでした。

最後までお読みいただき、ありがとうございました。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次