以前にスクリプト言語の「PHP8.0.0」の新機能「名前付き引数」について、その使用感や効果をご紹介しました(「PHP8.0.0の「名前付き引数」について調べてみた」)。
今回はその第二弾として、「match式」についてご紹介したいと思います。
match式は、条件に基づいて値を返す式です。
まずはmatch式の構文を見てみます。
●match式の構文
$return_value = match($value) { // 単一の条件式 1 => 返却値, // 複数の条件式をカンマ区切りで記述することもできる 2, 4 => 返却値, // どの条件式にも該当しないケースで実行される default => 返却値, // 末尾にセミコロンを記述する };
構文としてはシンプルに記述できるように思います。
一見するとswitch文に似ていますが、match式には次のような特徴があります。
ではそれぞれの特徴について見ていきましょう。
●match式の結果を変数に代入できる
match式は、if文やswitch文と違い、判定結果を変数に代入できます。
たとえば次のようなswitch文があります。
$value = 1; switch ($value) { case 1: $text = 'One'; break; case 2: $text = 'Two'; break; case 3: $text = 'Three'; break; default: $text = 'Other'; }
上記のswitch文を、match式に書き直すと次のようになります。
$text = match ($value) { 1 => 'One', 2 => 'Two', 3 => 'Three', default => 'Other', };
switch文に比べると、変数への代入や、case、breakといったキーワードの記述がなくなり、記述がシンプルになりました。
●厳密な型比較を行う
match式では、型と値の一致チェック(===)に基づいて条件が評価されます。
次の例では、$value がどの条件にも該当しないため、”default” に分岐され、$text に文字列リテラルの ‘Other’ が代入されます。
$value = '1'; $text = match ($value) { 1 => 'One', 2 => 'Two', default => 'Other', };
一方switch文では、緩やかな比較(もしくは、弱い比較とも呼ばれる)が行われます(==)。 緩やかな比較では、型が不一致の場合には自動変換して比較が行われます。 そのため、次の例では変数 $text に文字列リテラル ‘One’ が代入されてしまいます。
$value = '1'; switch ($value) { case 1: $text = 'One'; break; case 2: $text = 'Two'; break; default: $text = 'Other'; }
●switchと違い、後続の分岐は実行されない
match式は一つの条件に合致した段階で条件の判定が終了し、他のパターンは実行されません。switch文は、breakを記述しないと最初に合致した case 以降すべて実行されてしまいます。次の例に示すswitch文は、One Two Other のすべてが出力されてしまいます。
$value = 1; switch ($value) { case 1: echo 'One'; case 2: echo 'Two'; default: echo 'Other'; }
一方、次のmatch式では 条件式「1 => ‘One’」のみ実行され、他の条件は実行されずに最終的に ‘One’ という文字列が出力されます。
$value = 1; $text = match ($value) { 1 => 'One', 2 => 'Two', default => 'Other', }; echo $text;
●すべての場合を網羅しなければいけない
どの分岐でも処理できない場合、match式は UnhandledMatchError をスローします。次の例では、「$value = 3」に対応する条件式が存在しないためエラーとなります。
$value = 3; $text = match ($value) { 1 => 'One', 2 => 'Two', };
どの条件にも該当しない場合に、例外を発生させずにmatch式で処理を行いたい場合は、defaultパターンを使用します。
$value = 3; $text = match ($value) { 1 => 'One', 2 => 'Two', default => 'その他のパターンです', };
ということで、今回はPHP8.0.0で導入されたmatch式を取り上げました。
match式を適切に取り入れることで、より簡潔に安全に条件判定を伴う処理を記述することができます。
PHPは日々、言語仕様が改善されているので、今後のPHPの動向にも注目していきましょう。
■関連リンク
→制作実績 Web/システム開発
https://www.qbist.co.jp/works/web_appli.html
→Webサイト/システム開発等でお悩みでしたら、 ぜひ当社までお気軽にご相談ください。
https://www.qbist.co.jp/contact/index.html
「店舗の売上やオンラインの売上、全部がバラバラに管理されていて数字まとめるの面倒」 「せっかくのファイルもローカルに置いておくと出先で見られない」 「ノートパソコンでデータを持ち歩くとセキュリティ上、危険だし…………」 … “「スプレッドシート」で作業の時短効率化をめざそう 〜クラウド型表計算ソフト活用のすすめ〜” の続きを読む
先日、当社でもリリースを流しましたが、このたびアメリカのHeadSpin(ヘッドスピン)社と業務提携を交わし、スマートフォンアプリ向けのパフォーマンス自動監視サービス「HeadSpin」を取扱いできるようになりました。 … “HeadSpinとは? 〜快適なモバイル利用を支えるパフォーマンスの自動監視サービス〜” の続きを読む
「IoT」という言葉が世に出始めて、実はけっこう時間がたっています。日本政府の文書にIoTの文字が登場するのは2016年のこと、さらにその5年前にはドイツがすでに、AIやIoTを包括的に盛り込んだ国家戦略として「インダ … “今さら聞けない! IoT「モノのインターネット」とは?” の続きを読む