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式で書き直すと色々事故が起きそうなので、採用するにはまずは型比較を見直した方がよさそうです。