カテゴリ: PHP 更新日: 2026/04/22

PHP 8.0の新機能!match式を完全ガイド!switch文より安全で便利な新機能を初心者向けに解説

PHP 8.0以降のmatch式とは?switch文より安全で便利な新機能を解説
PHP 8.0以降のmatch式とは?switch文より安全で便利な新機能を解説

先生と生徒の会話形式で理解しよう

生徒

「PHPで、ある値によって処理を細かく分けるとき、if文をたくさん書くのが大変なんです。」

先生

「そんな時は、PHP 8.0から登場した『match(マッチ)式』がとても便利ですよ。従来のswitch(スイッチ)文よりも安全に書ける仕組みなんです。」

生徒

「match式ですか?switch文と何が違うのか、使い方も含めて詳しく教えてください!」

先生

「もちろんです。初心者の方でも分かりやすいように、身近な例えを使いながら解説していきますね!」

1. match式とは?

1. match式とは?
1. match式とは?

PHP 8.0というバージョンから新しく追加されたmatch(マッチ)式は、特定の「値」を調べて、その値にぴったり合う処理を返してくれる便利な仕組みです。プログラミングでは、これを制御構造(せいぎょこうぞう)と呼びます。制御構造とは、プログラムの流れを交通整理のように操るルールのことです。

例えば、「信号機の色が赤なら止まる」「青なら進む」といった条件分岐を、if文よりもずっとスッキリと、そして書き間違いが少なくなるように設計されたのがmatch式です。これまでのPHPではswitch文がよく使われてきましたが、match式はその進化版、いわば「次世代の条件分岐」と言えるでしょう。

match式は「式」であるため、結果をそのまま変数に代入できるという大きな特徴があります。これにより、コードの記述量を減らしつつ、読みやすいプログラムを作成することが可能になります。

2. match式の基本的な書き方

2. match式の基本的な書き方
2. match式の基本的な書き方

まずは、一番シンプルなmatch式の書き方を見てみましょう。match式は、調べたい対象の値をカッコの中に書き、その後に波カッコ {} で具体的な条件を並べていきます。

ここで重要な用語である厳密な比較について説明します。PHPの古い書き方では「数字の1」と「文字の1」を同じものとして扱ってしまうことがありましたが、match式はこれらを明確に区別します。これを「型(かた)をチェックする」と言い、プログラムが意図しない動きをするのを防いでくれます。


$status = 1;

$message = match ($status) {
    1 => '受付完了',
    2 => '準備中',
    3 => '発送済み',
    default => '不明なステータス',
};

echo $message;

実行結果は以下のようになります。


受付完了

このコードでは、変数 $status の中身が 1 なので、矢印 => の先にある「受付完了」という文字が変数 $message に保存されます。最後に default と書かれているのは、どの条件にも当てはまらなかった場合の「その他」という指定です。

3. switch文とmatch式の決定的な違い

3. switch文とmatch式の決定的な違い
3. switch文とmatch式の決定的な違い

これまで使われてきた switch 文と、新しい match 式にはいくつかの大きな違いがあります。初心者の方が特に覚えておくべきポイントは「戻り値(もどりち)」と「比較の厳密さ」です。

戻り値とは、処理の結果として返ってくる値のことです。switch文は「処理を実行するだけ」でしたが、match式は「結果を値として返す」ことができます。そのため、先ほどの例のように変数に直接結果を放り込むことができるのです。

また、switch文では break; という「ここで処理を終わりにする」という命令を書き忘れると、下の処理まで勝手に実行されてしまうという「フォールスルー」という落とし穴がありました。match式ではこの break; を書く必要がなく、合致した一行だけを実行してスマートに終了します。

さらに、match式は網羅性(もうらせ)を求めます。つまり、どの条件にも当てはまらないのに default が書かれていない場合、PHPは「エラー」を出して教えてくれます。これは、プログラムのバグ(間違い)を未然に防ぐための非常に強力な安全機能です。

4. 複数の条件をまとめて処理する方法

4. 複数の条件をまとめて処理する方法
4. 複数の条件をまとめて処理する方法

「Aの場合もBの場合も、同じ処理をしたい」という場面はよくあります。match式では、条件をカンマ , で区切るだけで、複数の値を一つの処理にまとめることができます。これは非常にシンプルで読みやすい書き方です。


$fruit = 'apple';

$result = match ($fruit) {
    'apple', 'strawberry', 'cherry' => '赤い果物です',
    'banana', 'lemon' => '黄色い果物です',
    'melon' => '緑の果物です',
    default => 'その他の色の果物です',
};

echo $result;

実行結果は以下のようになります。


赤い果物です

このように、一つの矢印に対して複数のキーワードを指定できるため、同じ内容を何度も書かなくて済みます。スッキリとしたコードは、後から見返したときに内容を理解しやすくなるため、プログラミングにおいてとても大切な要素です。

5. defaultキーワードの重要性

5. defaultキーワードの重要性
5. defaultキーワードの重要性

match式を使う上で、default(デフォルト)は非常に重要な役割を持ちます。これは、どの条件にも一致しなかった場合に選ばれる「予備の処理」です。日常生活で例えるなら、「メニューにないものを注文されたら『ありません』と答える」という決まりを作っておくようなものです。

もし default を書かずに、定義されていない値が渡されると、PHPは「UnhandledMatchError」というエラーを発生させます。一見厳しく感じますが、これはプログラマーに対して「全てのパターンを考慮していますか?」と問いかけてくれているのです。予測できない値を放置しないことで、システムの停止や予期せぬ挙動を防ぐことができます。


$user_role = 'guest';

$access_level = match ($user_role) {
    'admin' => '全機能を利用可能',
    'editor' => '記事の編集が可能',
    'user' => '閲覧とコメントが可能',
    default => '権限がありません',
};

echo $access_level;

実行結果は以下のようになります。


権限がありません

この例では、ユーザーの役割が guest ですが、条件の中に guest はありません。そのため、一番下の default が採用され、安全にメッセージが表示されます。

6. match式で数値の範囲や複雑な条件を扱う

6. match式で数値の範囲や複雑な条件を扱う
6. match式で数値の範囲や複雑な条件を扱う

match式の応用編として、値が「一致するかどうか」だけでなく、「10以上かどうか」といった複雑な条件(比較演算子)を使う方法を紹介します。これには、matchのカッコの中に true を入れるというテクニックを使います。

これは「条件式の結果が true(正しい)になるものはどれか?」を探すという書き方です。これにより、数値の範囲指定などが可能になり、活用の幅がぐっと広がります。


$score = 85;

$grade = match (true) {
    $score >= 90 => '優秀',
    $score >= 80 => '良好',
    $score >= 70 => '普通',
    default => 'がんばりましょう',
};

echo 'あなたの成績は「' . $grade . '」です。';

実行結果は以下のようになります。


あなたの成績は「良好」です。

この書き方を知っておくと、複雑なif文の塊を美しく整理することができます。特に条件が5つも6つも続くような場合、match式を使うことでコードの「見通し」が劇的に良くなります。

7. match式を使うメリットの総復習

7. match式を使うメリットの総復習
7. match式を使うメリットの総復習

ここまで、match式の使い方を詳しく見てきました。最後に、なぜ初心者がこの機能を積極的に使うべきなのか、そのメリットを整理しましょう。SEOキーワードとしても重要な「安全性」と「保守性(メンテナンスのしやすさ)」がキーワードです。

まず第一に、厳密な比較を行ってくれる点です。これにより、意図しない型の混同によるバグを防げます。第二に、式の値を返せる点です。これにより、変数の初期化と代入を同時に行え、コードが簡潔になります。第三に、breakが不要な点です。単純なミスで処理が突き抜けてしまう心配がありません。そして第四に、エラーで未対応を防げる点です。条件の漏れをPHPが即座に指摘してくれるため、信頼性の高いプログラムが書けるようになります。

プログラミングを始めたばかりの頃は、if文だけで何とかしようとしがちですが、このmatch式を覚えるだけで、あなたの書くコードは一気にプロっぽく、そして安全なものへと進化します。PHP 8.0以降の環境を使っているのであれば、ぜひ積極的に取り入れてみてください。

まとめ

まとめ
まとめ

ここまでPHP 8.0で導入された新機能、match式(マッチしき)の基本から応用までを詳しく解説してきました。従来のPHPプログラミングでは、条件分岐といえば if 文や switch 文が主流でしたが、最新のPHP開発シーンにおいては、この match 式を使いこなすことが「読みやすく、バグの少ないコード」を書くための必須スキルとなっています。

match式がなぜ最強の条件分岐なのか

プログラムを書く上で最も怖いのは、意図しない動作(バグ)です。match 式は、その設計思想自体に「安全性の向上」が組み込まれています。例えば、型を厳密にチェックする性質(厳密な比較)により、数値の 0 と空文字 '' を混同するといった、初心者からベテランまでが陥りやすいミスを未然に防いでくれます。また、switch 文で多くの開発者を悩ませた「break文の書き忘れによる処理の突き抜け(フォールスルー)」という構造上の欠陥が、match 式では根本から解消されています。

実践的なサンプルプログラムで復習

実際のWebアプリケーション開発では、ユーザーのステータスや権限に応じて表示を切り替える処理が頻繁に登場します。以下に、これまで学んだ「複数条件の統合」と「戻り値の代入」を組み合わせた、実践的なコード例を紹介します。この書き方をマスターすれば、あなたのPHPコードは格段にスマートになります。


$orderStatus = 'shipping_in_progress';

// match式を使って配送状況のラベルと色情報を一気に取得する
$displayData = match ($orderStatus) {
    'ordered' => ['text' => '注文済み', 'class' => 'bg-secondary'],
    'payment_confirmed', 'preparing' => ['text' => '準備中', 'class' => 'bg-info'],
    'shipping_in_progress' => ['text' => '配送中', 'class' => 'bg-primary'],
    'delivered' => ['text' => '配達完了', 'class' => 'bg-success'],
    default => ['text' => 'エラー', 'class' => 'bg-danger'],
};

echo 'ステータス:' . $displayData['text'];

上記の実行結果は次のようになります。


ステータス:配送中

このように、配列を戻り値として返すこともできるため、条件に応じた複雑なデータセットの切り替えも一行の match 式で完結させることが可能です。

導入時の注意点とSEO・保守性の観点

PHP 8.0以上の環境であれば、match 式を使わない手はありません。しかし、それ以前の古いサーバー環境(PHP 7.4系など)では動作しないため、開発環境のバージョン確認は必ず行いましょう。モダンなPHPフレームワークである LaravelSymfony を使った開発現場では、すでに match 式が標準的に利用されています。

また、コードの読みやすさ(可読性)が向上することは、チーム開発におけるメンテナンスコストの削減に直結します。検索エンジンが直接プログラムの中身を見るわけではありませんが、エラーの少ない高品質なWebサイトを構築することは、間接的にユーザー体験(UX)を高め、サイトの信頼性を向上させることにつながります。

最後に覚えておくべき4つのポイント

  • 厳密な型比較:値だけでなくデータ型までしっかりチェックする
  • 式として値を返す:変数への直接代入が可能でコードが短くなる
  • フォールスルーなし:break文が不要になり、記述ミスが激減する
  • 網羅性の保証:一致する条件がない場合にエラーが出るため、考慮漏れを防げる

プログラミングの学習において、新しい構文を覚えるのは最初は大変かもしれませんが、match 式は一度慣れてしまうと「もう switch 文には戻れない」と感じるほど快適です。今日からぜひ、自分のプログラムに取り入れてみてください。

先生と生徒の振り返り会話

生徒

「先生、ありがとうございました!match 式って、ただの switch 文の書き換えだと思っていましたが、全然違うんですね。特に『値をそのまま変数に入れられる』っていうのが、実際にコードを書いてみてすごく便利だと感じました!」

先生

「その通りです!気づきましたね。switch 文だと、まず変数を空で作っておいて、その中で代入処理を何度も書かなきゃいけなかったでしょう?match 式なら、代入を一回で済ませられるから、プログラムがとてもクリーンになるんですよ。」

生徒

「あと、default を書き忘れてエラーが出たとき、最初はびっくりしましたが、逆に『あ、条件が漏れてるんだな』ってすぐに気づけるのが親切だなと思いました。もし if 文だったら、何も起きずにバグに気づかないまま公開しちゃうところでした。」

先生

「素晴らしい視点ですね。エラーが出ることは悪いことではなく、プログラムを安全に守るための防護柵のようなものなんです。特に複数人で開発する現場では、そういった『強制力のあるルール』がプロジェクトを成功に導きます。」

生徒

「型についても勉強になりました。文字列の '100' と数値の 100 を勝手に同じだと思われないように、これからは match 式をどんどん使っていこうと思います!」

先生

「いい意気込みですね!PHP 8.0以降のモダンな書き方を習得していけば、エンジニアとしての市場価値も間違いなく上がります。この調子で、新しい機能を自分の武器にしていきましょう!」

カテゴリの一覧へ
新着記事
New2
Symfony
SymfonyでAPI向けにカスタムエラーメッセージを返す方法を解説!初心者でも安心のバリデーション基礎
New3
Symfony
Symfonyの動的フォームフィールド追加・削除を完全ガイド!初心者でもわかるフォーム操作入門
New4
Laravel
LaravelのMailableクラスの使い方を完全解説!初心者でもできるメール送信管理
人気記事
No.1
Java&Spring記事人気No1
CodeIgniter
CodeIgniterのセッション管理を徹底解説!値を保存・取得する基本操作
No.2
Java&Spring記事人気No2
Laravel
Laravelのnow()・today()関数の使い方完全ガイド!初心者でもわかる日時処理と日付操作
No.3
Java&Spring記事人気No3
Laravel
Laravelのabort()関数でエラーを返す方法!初心者向け完全ガイド
No.4
Java&Spring記事人気No4
Symfony
Symfony Twig入門|条件分岐とループをやさしく理解するテンプレート活用術
No.5
Java&Spring記事人気No5
Laravel
Laravelの日付バリデーションの使い方を完全解説!初心者でも安心の丁寧ガイド
No.6
Java&Spring記事人気No6
Laravel
Laravelのインストール方法まとめ!ComposerとLaravel Installerの使い方
No.7
Java&Spring記事人気No7
Laravel
Laravelの@eachディレクティブで簡単に繰り返しテンプレートを表示する方法
No.8
Java&Spring記事人気No8
Laravel
LaravelのThrottleミドルウェアでアクセス制限を実装する方法!初心者向け解説