[php8]match式の使ってみた

php

php8のmatch式の使ってみた

php8からmatch式が使えるようになりました。
switch文に似ていますが挙動は異なるので、使う時には注意しましょう。

公式の記事はこちらです。

match式を使用するサンプルコード

サンプルコード

下記は数値を渡して、漢数字を返すmatch式です。

$score = 2;
$result = match ($score) {
    1 => '一',
    2 => '二',
    3 => '三',
    default => '他'
};

echo $result."\n"

switch文と似ていますが、match式では値が左の条件にマッチしたら、そのまま右に定義している返却値を返してくれます。
あと、switch文は比較する場合は相互変換した値の比較(==)ですが、matchでは型まで完全一致(===)です。

どれにも当てはまらない場合のデフォルトは、上記のようにdefaultを書くと定義することができます。
上記では、1,2,3どれでもない場合はデフォルトになります。

match式を実行する

上記のmatch文を実行すると、このように出力されます。
渡した値にマッチした返却値が返ってきました。

match式で発生するエラー

デフォルトを定義していない場合で、あてはまらない値を渡したら、このようにエラーになります。

Fatal error: Uncaught UnhandledMatchError: Unhandled match value of type string in /var/www/html/match.php:7
Stack trace:
#0 {main}
  thrown in /var/www/html/match.php on line 7

このエラーはUnhandledMatchErrorをExceptionとして、スローしています。
UnhandledMatchErrorについては、公式のこちらに書いています。

switch文との比較

defaultが定義されていない、下記のようなコード($scoreが4)の場合を確認すると
switch文では、エラーはスローされずに処理を抜けてきて、$resultには何も設定されていない状態になります。

match式で同じように書いた場合にはエラーになります。

$score = 4;
switch ($score) {
    case 1:
        $result = '一';
        break;
    case 2:
        $result = '二';
        break;
    case 3:
        $result = '三';
        break;
}

また、下記のようなコード($scoreが’1′)の場合、switch文では、相互変換した値の比較なので、一致して、$resultは一になります。
match式同じように書いた場合には完全一致なので、一致せずにエラーになります。

$score = '1';
switch ($score) {
    case 1:
        $result = '一';
        break;
    case 2:
        $result = '二';
        break;
    case 3:
        $result = '三';
        break;
}

コメント

タイトルとURLをコピーしました