php8で新たに採用されたmatch式と switch文の記述違い サクッと説明

2022/02/21

php8から使用可能になったmatch式の説明です。尚、自社サーバーは7系だったのでローカルで試しました。

書き方の違い

switch ($statusCode)
{
    case 200:
    case 300:
        $message = null;
        break;
    case 400:
        $message = 'not found';
        break;
    case 500:
        $message = 'server error';
        break;
    default:
        $message = 'unknown status code';
        break;
}

$message = match ($statusCode) 
{
    200, 300 => null,
    400 => 'not found',
    500 => 'server error',
    default => 'unknown status code',
};

match式は

・breakがいらない

・返り値があるので、指定するのは一度だけ



$statusCode = '200';

$message = match ($statusCode) 
{
    200 => null,
    default => 'unknown status code',
};

// 'unknown status code'

厳密な比較なので上記ではdefaultのvalueが返されます。

$statusCode = 400;

$message = match ($statusCode) 
{
    200 => 'perfect',
};

// UnhandledMatchError

switch文だとスルーしてしまうケースでもエラーを返します。

$message = [
    $this->matchesRegex($line) => 'match A',
    $this->matchesOtherRegex($line) => 'match B',
][$line] ?? 'no match';

どうやらmatch式を採用するにあたり、上記の書き方が出来てしまうことで最初に全パターンの正規表現関数が実行されパフォーマンスが落ちるので反対意見もあったそうです。

厳密な比較になりますので既存のコードをいきなりmatch式で書き直すと色々事故が起きそうなので、採用するにはまずは型比較を見直した方がよさそうです。

contact us お問い合わせ

Contact お問い合わせ・ご相談

Webサービス・システム開発の
ご相談はお気軽にご連絡ください。

Recruit 求人へのご応募

サニージェムでは現在、プロジェクトの推進を
担う仲間を募集しています。