0Pricing
PHP Academy · レッスン

SwitchとMatch文

switchとPHP 8のmatchを使い、多分岐ロジックを記述します。

「SwitchとMatch文」はCoddyKit上の無料PHP Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはPHP Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 PHP Academyコースには全4レッスンが含まれています。

switch と if のチェーン

1つの変数の値に基づいて多くの分岐を行う場合、長い if/elseif チェーンよりも switch のほうがすっきりします。

PHP 8では、現代的で厳密な代替手段として match が導入されました。

switch 文の基本

switch は式を1回評価し、一致する case ブロックを実行します。

<?php
$day = 'Monday';

switch ($day) {
    case 'Monday':
        echo 'Start of work week';
        break;
    case 'Friday':
        echo 'Almost weekend';
        break;
    default:
        echo 'Midweek';
}

フォールスルーの動作

break がない場合、実行は次の case へフォールスルーします。意図的に処理をまとめるテクニックです。

<?php
$status = 2;

switch ($status) {
    case 1:
    case 2:
    case 3:
        echo 'In progress';  // runs for 1, 2, or 3
        break;
    case 4:
        echo 'Done';
        break;
}

switch は弱い比較を使用する

switch は内部で ==(弱い比較)を使用するため、予想外の一致が発生することがあります。

<?php
$val = 0;

switch ($val) {
    case 'foo':   // 0 == 'foo' in PHP 7!
        echo 'match foo';
        break;
    case 0:
        echo 'match zero';  // PHP 8 fixes this
        break;
}
// PHP 8: match zero (fixed)
// PHP 7: match foo (bug!)

PHP 8の match 式

match は switch に似ていますが、厳密な比較を使用し、値を返すため、break は必要ありません。

<?php
$status = 'active';

$label = match($status) {
    'active'   => 'Currently active',
    'inactive' => 'Not active',
    'pending'  => 'Awaiting activation',
    default    => 'Unknown status',
};

echo $label; // Currently active

一致しない場合の match の例外

match でどのアームにも一致せず、default もない場合は、UnhandledMatchError がスローされます。

<?php
$code = 99;

try {
    $result = match($code) {
        200 => 'OK',
        404 => 'Not Found',
        500 => 'Server Error',
        // no default!
    };
} catch (\UnhandledMatchError $e) {
    echo 'Unhandled match value: ' . $code;
}

複数の条件を持つ match

1つの match アームには、カンマで区切った複数の値を指定できます。

<?php
$lang = 'tr';

$region = match($lang) {
    'en', 'en-US', 'en-GB' => 'English',
    'tr', 'az'             => 'Turkic',
    'fr', 'be', 'ca'       => 'French-speaking',
    default                => 'Other',
};

echo $region; // Turkic

複雑な式を使う match

match アームの右辺には、任意の式を使用できます。

<?php
$score = 85;

$grade = match(true) {
    $score >= 90 => 'A',
    $score >= 80 => 'B',  // matches
    $score >= 70 => 'C',
    default      => 'F',
};

echo $grade; // B

match からの return

match は式なので、値が必要な場所であればどこでも使用できます。

<?php
function getHttpMessage(int $code): string {
    return match($code) {
        200 => 'OK',
        201 => 'Created',
        400 => 'Bad Request',
        401 => 'Unauthorized',
        404 => 'Not Found',
        default => 'Unknown',
    };
}

echo getHttpMessage(404); // Not Found

return コンテキストでの switch

switch は関数内で使用して異なる値を返せますが、match のほうがすっきり記述できます。

<?php
function describe(int $n): string {
    switch (true) {
        case $n < 0:  return 'negative';
        case $n === 0: return 'zero';
        default:       return 'positive';
    }
}

echo describe(-5);  // negative
echo describe(0);   // zero
echo describe(7);   // positive

switch と match の使い分け

選択の指針です。

  • 厳密な比較と戻り値が必要な場合は match を使用します(PHP 8以降)
  • 処理をフォールスルーでまとめる場合や、PHP 7をサポートする場合は switch を使用します
  • 複数の値による分岐では、どちらも長い if/elseif チェーンよりすっきり記述できます

クイックチェック

match 式でどのアームにも一致せず、default もない場合はどうなりますか。

まとめ: switch と match

主な違いです。

  • switch — 弱い比較、フォールスルー、PHP 4以降
  • match — 厳密な比較、フォールスルーなし、値を返す、PHP 8以降
  • match は default がない場合に UnhandledMatchError をスローします
  • match アームでは、カンマで区切った複数の値を受け付けます

次は for ループと while ループです。

よくある質問

「SwitchとMatch文」レッスンは無料ですか?

はい。「SwitchとMatch文」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、PHP Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 PHP Academyコースには全4レッスンが含まれています。

「SwitchとMatch文」で何を学びますか?

switchとPHP 8のmatchを使い、多分岐ロジックを記述します。 ブラウザで直接実行するハンズオンコードでPHP Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

PHP Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのPHP Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「SwitchとMatch文」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このPHP Academyレッスンでコードを書いて実行できますか?

はい。すべてのPHP Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. if、elseif、else
  2. SwitchとMatch文
  3. forとwhileループ
  4. foreachとループ制御
← PHP Academyに戻る