te14

PHP 8: 一致または切り替え?

(jp) =

PHP 8 では、新しい match 表現。 多くの場合、使用するよりも優れた選択肢となる強力な機能 switch. では、違いは正確には何ですか?

まずは両者の比較から。 ここに古典があります switch 例:

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;

これがその match 同等:

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

まず第一に、 match 式は大幅に短くなります:

  • それは必要ありません break 声明
  • コンマを使用して異なるアームを 1 つに結合できます。
  • 値を返すため、値を一度だけ割り当てる必要があります

すでにかなりの量ですが、さらに多くの機能があります。

# 型強制なし

match 緩いものではなく厳密な型チェックを行います。 使うようなものです === それ以外の ==. それが良いことかどうかについてはおそらく意見が分かれるでしょうが、それ自体がトピックです。

$statusCode = '200';

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

tpyoに気づきましたか? PR を送信して修正することができます。 このブログの最新情報を知りたい場合は、私をフォローしてください。 ツイッター または私のニュースレターを購読してください:

# 不明な値はエラーを引き起こします

値を確認するのを忘れた場合、および値がない場合 default arm を指定すると、PHP は UnhandledMatchError 例外。 もう一度厳密にしますが、微妙なバグが見過ごされるのを防ぎます。

$statusCode = 400;

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

# 今のところ、単一行の式のみ

短いクロージャと同様に、1 つの式しか記述できません。 式ブロックはおそらくある時点で追加されるでしょうが、正確にいつ追加されるかはまだ明確ではありません.

# 条件の組み合わせ

あなたはすでに不足に気づいています break? これはまた、 match 2つを組み合わせたようなフォールスルー条件は許可されません case 最初の行 switch 例。 一方、コンマで区切って同じ行に条件を組み合わせることができます。

したがって、この点で switch と同じ機能がありますが、書き込みが少なく、失敗する方法が少なくなります。 ウィンウィン!

$message = match ($statusCode) 
    200, 300, 301, 302 => 'combined expressions',
;

# 複雑な条件とパフォーマンス

RFC の議論中に、一部の人々は、 match 表現:

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

ただし、大きな注意点が 1 つあります。この手法では、最初にすべての正規表現関数が実行されるため、パフォーマンスが低下します。 の良い議論 match.

# 例外のスロー

最後に、PHP 8 のスロー式により、必要に応じてアームから直接スローすることもできます。

$message = match ($statusCode) 
    200 => null,
    500 => throw new ServerError(),
    default => 'unknown status code',
;

# パターンマッチング

わかりました、もう 1 つ、パターン マッチングがあります。 これは、単純な値よりも複雑なマッチングを可能にするために、他のプログラミング言語で使用される手法です。 正規表現と考えてください。ただし、テキストではなく変数用です。

パターン マッチングは非常に複雑な機能であるため、現時点ではサポートされていませんが、RFC の作成者である Ilija Tovilo は、将来の機能の可能性について言及しています。 注意すべきこと!

# それで、スイッチかマッチか?

要約する必要がある場合は、 match 一言で表現すると、it’s little のより厳密で現代的なバージョンだと思います。 switch 兄弟。

いくつかのケースがあります— 私がそこで何をしたか見てください。 – どこ switch は、特に複数行のコード ブロックで、より柔軟性を提供します。 ただし、その厳しさは match 演算子は魅力的であり、パターン マッチングの観点は、PHP のゲーム チェンジャーになるでしょう。

私は私が書いたことがないことを認めます switch 多くの癖があるため、過去数年間の声明。 その癖 match 実際に解決します。 まだ完璧ではありませんが、考えられる使用例があります。 match 良いだろう… 一致します。

なに あなたの意見?

次の投稿
ルイジアナ州で最も寒い場所を発見する
前の投稿
すでに完璧なウィッチャー 3 PS5 は 60fps とフォト モードを追加

あなたはおそらくそれも好きでしょう

ノート:

AZ: 動物の世界、ペット、ペット、野生の自然に関するカテゴリー記事…
SP:スポーツカテゴリー。
New vs Ne: ニュースコラム。
Te: テクノロジー カテゴリ。
Gt:エンターテインメントカテゴリー。
Bt: 占い、星占い、超常現象、超常現象。
Ta:人生コラム。