PHP8.0.0の「match式」について調べてみた

以前にスクリプト言語の「PHP8.0.0」の新機能「名前付き引数」について、その使用感や効果をご紹介しました(「PHP8.0.0の「名前付き引数」について調べてみた」)。
今回はその第二弾として、「match式」についてご紹介したいと思います。

 

match式とは?

match式は、条件に基づいて値を返す式です。
まずはmatch式の構文を見てみます。

●match式の構文

$return_value = match($value) {
  // 単一の条件式
  1 => 返却値,
  // 複数の条件式をカンマ区切りで記述することもできる
  2, 4 => 返却値,
  // どの条件式にも該当しないケースで実行される
  default => 返却値,
  // 末尾にセミコロンを記述する
};

構文としてはシンプルに記述できるように思います。
一見するとswitch文に似ていますが、match式には次のような特徴があります。

  • ・match式の結果を変数に代入できる
  • ・厳密な型比較を行う
  • ・switch文と違い、後続の分岐は実行されない
  • ・すべての場合を網羅しなければいけない

 
ではそれぞれの特徴について見ていきましょう。

match式の特徴

●match式の結果を変数に代入できる
match式は、if文やswitch文と違い、判定結果を変数に代入できます。
たとえば次のようなswitch文があります。

$value = 1;
switch ($value) {
  case 1:
    $text = 'One';
    break;
  case 2:
    $text = 'Two';
    break;
  case 3:
    $text = 'Three';
    break;
  default:
    $text = 'Other';
}

上記のswitch文を、match式に書き直すと次のようになります。

$text = match ($value) {
  1 => 'One',
  2 => 'Two',
  3 => 'Three',
  default => 'Other',
};

switch文に比べると、変数への代入や、case、breakといったキーワードの記述がなくなり、記述がシンプルになりました。

●厳密な型比較を行う
match式では、型と値の一致チェック(===)に基づいて条件が評価されます。
次の例では、$value がどの条件にも該当しないため、”default” に分岐され、$text に文字列リテラルの ‘Other’ が代入されます。

$value = '1';
$text = match ($value) {
  1 => 'One',
  2 => 'Two',
  default => 'Other',
};

一方switch文では、緩やかな比較(もしくは、弱い比較とも呼ばれる)が行われます(==)。 緩やかな比較では、型が不一致の場合には自動変換して比較が行われます。 そのため、次の例では変数 $text に文字列リテラル ‘One’ が代入されてしまいます。

$value = '1';
switch ($value) {
  case 1:
    $text = 'One';
    break;
  case 2:
    $text = 'Two';
    break;
  default:
    $text = 'Other';
}

●switchと違い、後続の分岐は実行されない
match式は一つの条件に合致した段階で条件の判定が終了し、他のパターンは実行されません。switch文は、breakを記述しないと最初に合致した case 以降すべて実行されてしまいます。次の例に示すswitch文は、One Two Other のすべてが出力されてしまいます。

$value = 1;
switch ($value) {
  case 1:
    echo 'One';
  case 2:
    echo 'Two';
  default:
    echo 'Other';
}

一方、次のmatch式では 条件式「1 => ‘One’」のみ実行され、他の条件は実行されずに最終的に ‘One’ という文字列が出力されます。

$value = 1;
$text = match ($value) {
  1 => 'One',
  2 => 'Two',
  default => 'Other',
};
echo $text;

●すべての場合を網羅しなければいけない
どの分岐でも処理できない場合、match式は UnhandledMatchError をスローします。次の例では、「$value = 3」に対応する条件式が存在しないためエラーとなります。

$value = 3;
$text = match ($value) {
  1 => 'One',
  2 => 'Two',
};

どの条件にも該当しない場合に、例外を発生させずにmatch式で処理を行いたい場合は、defaultパターンを使用します。

$value = 3;
$text = match ($value) {
  1 => 'One',
  2 => 'Two',
  default => 'その他のパターンです',
};

ということで、今回はPHP8.0.0で導入されたmatch式を取り上げました。
match式を適切に取り入れることで、より簡潔に安全に条件判定を伴う処理を記述することができます。
PHPは日々、言語仕様が改善されているので、今後のPHPの動向にも注目していきましょう。

 

■関連リンク

→制作実績 Web/システム開発
https://www.qbist.co.jp/works/web_appli.html

→Webサイト/システム開発等でお悩みでしたら、 ぜひ当社までお気軽にご相談ください。
https://www.qbist.co.jp/contact/index.html

関連記事