(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',
;
# 不明な値はエラーを引き起こします
値を確認するのを忘れた場合、および値がない場合 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
良いだろう… 一致します。
なに あなたの意見?