PHPを使っていると遭遇する「はてなマーク2つ」??(クエスチョンマーク2つ)の処理が何をしているかについて実例を用いて解説しています。
この ?? は、配列で指定したキーが存在しない場合にエラーを回避するためにとても便利な演算子なので、使い方を知っておくと有効活用できます。
はてなマーク2つ??(クエスチョンマーク2つ)とは?
はてなマーク2つ(クエスチョンマーク2つ)の処理が何をしているかというと、指定された式や変数が null か判定して、もしnullの場合は後ろの式や値を実行するという処理をしています。
正式名称と基本構文
正式名称は ??演算子 または null合体演算子 といいます。
基本構文は以下のようになります。
(expr1) ?? (expr2)
exprはexpressionの略で式という意味です。expr1を実行しようとして、nullならば後ろの expr2を実行します。
実例1:値の場合
??の後ろの式が実行されるのは、前者の式がnullの場合のみです。
echo null ?? "後ろの式" ;
//出力
後ろの式
空文字(””)はnullではないので、空文字が実行され、後ろの式は実行されません。
echo "" ?? "後ろの式" ;
//出力
実例2:変数の場合
変数の場合も同じく??の後ろの式が実行されるのは、前者の式がnullの場合のみです。
$expr1 = null;
$expr2 = "後ろの式";
echo $expr1 ?? $expr2 ;
//出力
後ろの式
空文字(””)はnullではないので、空文字が実行され、後ろの式は実行されません。
$expr1 = "";
$expr2 = "後ろの式";
echo $expr1 ?? $expr2 ;
//出力
実例3:配列の場合
空の配列もnullではないので、空の配列がそのまま返ります。
$arr1 = [];
$arr2 = ["後ろの配列"];
var_dump( $arr1 ?? $arr2 );
//出力
array(0) {}
連想配列で存在しないキーを指定した場合値がnullになり、後ろの式が実行されます。
$arr1= [];
$arr2 = ["key2" => "val2"];
var_dump( $arr1["key1"] ?? $arr2["key2"] );
//出力
string(4) "val2"
通常だと、存在しないキー名を指定するとエラー(Undefined array key)が発生するので、指定したキーが空の場合にエラーを発生させずに処理をするために重宝します。
当然ですが値にnullが指定されている場合も同じ処理になります。
$arr1= ["key1" => null];
$arr2 = ["key2" => "val2"];
var_dump( $arr1["key1"] ?? $arr2["key2"] );
//出力
string(4) "val2"
??演算子(null合体演算子)の連結
??演算子(null合体演算子)は連結(ネスト)して使うこともできます。
前方の式から順に実行していき、nullなら次の式へと移っていきます。
例えば以下の例の場合、$foo, $barはnullなので次の式へと移り、値のある$bazが実行されます。
実行されれば処理はそこでストップし、次の$quxは実行されません。
<?php
$foo = null;
$bar = null;
$baz = "bazの値";
$qux = "quxの値";
echo $foo ?? $bar ?? $baz ?? $qux;
//出力
bazの値
??演算子(null合体演算子)の処理内容
??演算子(null合体演算子)の処理内容は、if文と変数が存在していて、値がnullでないかを確認するisset関数の組み合わせです。
例えば、次の??演算子を用いた処理は、
$arr1= [];
$arr2 = ["key2" => "val2"];
var_dump( $arr1["key1"] ?? $arr2["key2"] );
//出力
string(4) "val2"
if elseを用いた以下の処理と同じです。
$arr1= [];
$arr2 = ["key2" => "val2"];
if ( isset($arr1["key1"]) ){
var_dump( $arr1["key1"] );
} else{
var_dump( $arr2["key2"] );
}
//出力
string(4) "val2"
??演算子を使うことで処理がかなりシンプルに記述できていることがわかります。
とても便利な演算子なのでぜひ色々と使ってみてください。
演算子&& と || との違い
??演算子のように、同じ記号を2回続けて使う演算子に && を2回(アンドを2回)続ける論理積演算子と、||を2回(パイプを2回)続ける論理和演算子があります。
??演算子は与えられた式を実行するものでしたが、&&演算子や||演算子は、与えられた式を実行するのではなく、評価した結果を返します。(式自体が実行(コール)されることはありません)
このため、出力は0(false)か1(true)のどちらかになります。
&&演算子や||演算子はnull自体は評価できますが、配列の存在しないキー を指定すると PHP Warning: Undefined array key というエラーが発生します。
演算子の使い方 | 同義 | 内容 |
---|---|---|
$a || $b | $a or $b | $a または $b のどちらかが true の場合に true |
$a && $b | $a and $b | $a および $b が共に true の場合に true |