T-CREATOR

PHP 構文チートシート:配列・クロージャ・型宣言・match を一枚で把握

PHP 構文チートシート:配列・クロージャ・型宣言・match を一枚で把握

PHP の開発では、配列操作、クロージャの活用、型宣言による安全性向上、そして match 式による条件分岐の簡潔化が、コード品質を大きく左右します。しかし、これらの構文を毎回ドキュメントで調べるのは効率的ではありませんよね。

本記事では、PHP 8.x 系でよく使う「配列」「クロージャ」「型宣言」「match」の 4 つのテーマに絞って、実務で即使えるチートシートとしてまとめました。コピー&ペーストですぐに活用できるコード例と、わかりやすい図解で、PHP 構文を一枚で把握できます。

早見表

各構文の特徴と主な使い方を、表形式で素早く確認できます。

配列操作 早見表

#操作構文例説明
1配列の作成$arr = [1, 2, 3];短縮構文で配列を作成
2連想配列$assoc = ['key' => 'value'];キーと値のペア
3要素の追加$arr[] = 4;末尾に要素を追加
4要素の取得$value = $arr[0];インデックスで取得
5配列の結合array_merge($arr1, $arr2)複数配列を結合
6配列のマップarray_map($callback, $arr)各要素に関数を適用
7配列のフィルタarray_filter($arr, $callback)条件に合う要素のみ抽出
8配列の簡約array_reduce($arr, $callback)配列を単一値に変換
9スプレッド演算子[...$arr1, ...$arr2]PHP 7.4+ で配列展開
10分割代入[$a, $b] = $arr;配列を変数に分割

クロージャ 早見表

#機能構文例説明
1基本のクロージャ$fn = function() { };無名関数の定義
2use で変数取り込みfunction() use ($var) { }外部変数をキャプチャ
3アロー関数fn($x) => $x * 2PHP 7.4+ の短縮構文
4型宣言付きfunction(int $x): int { }引数と戻り値に型指定
5コールバックとして利用array_map($fn, $arr)配列関数に渡す
6参照で取り込みfunction() use (&$var) { }外部変数を参照で変更

型宣言 早見表

#構文例説明
1intfunction(int $x): int整数型
2floatfunction(float $x): float浮動小数点数型
3stringfunction(string $s): string文字列型
4boolfunction(bool $b): bool真偽値型
5arrayfunction(array $arr): array配列型
6objectfunction(object $obj): objectオブジェクト型
7mixedfunction(mixed $x): mixed任意の型(PHP 8.0+)
8null 許容型function(?int $x): ?intnull も許容
9Union 型function(int|string $x)複数型のいずれか(PHP 8.0+)
10voidfunction(): void戻り値なし
11neverfunction(): never決して返らない(PHP 8.1+)
12プロパティ型private int $count;クラスプロパティに型指定

match 式 早見表

#機能構文例説明
1基本の matchmatch($val) { ... }式として値を返す
2単一条件1 => 'one'値が一致したら結果を返す
3複数条件1, 2 => 'low'カンマ区切りで複数指定
4defaultdefault => 'other'どれにも一致しない場合
5厳密比較=== で比較switch と異なり型も厳密
6式の利用$result = match($x) { ... };変数に代入可能

背景

PHP は Web 開発のバックエンド言語として長い歴史を持ち、WordPress や Laravel をはじめとする多くのフレームワーク・CMS で採用されています。しかし、バージョンアップごとに新しい構文や機能が追加され続けており、特に PHP 7.4 から PHP 8.x への移行では、アロー関数、名前付き引数、Union 型、match 式など、開発体験を大きく向上させる機能が一気に投入されました。

以下の図は、PHP のバージョンアップと主要機能の追加タイミングを示しています。

mermaidflowchart LR
  php74["PHP 7.4<br/>アロー関数<br/>型付きプロパティ"]
  php80["PHP 8.0<br/>match 式<br/>Union 型<br/>名前付き引数"]
  php81["PHP 8.1<br/>Enum<br/>never 型<br/>First-class callable"]
  php82["PHP 8.2<br/>読み取り専用クラス<br/>DNF 型"]

  php74 --> php80
  php80 --> php81
  php81 --> php82

このように、PHP は急速に進化しており、新しい構文を活用することで、コードの可読性、保守性、型安全性が飛躍的に向上します。しかし、すべての構文を記憶するのは現実的ではありません。

そこで、実務でよく使う「配列操作」「クロージャ」「型宣言」「match 式」の 4 つに絞り、すぐに参照できるチートシートとして整理することが有効です。

課題

PHP 開発において、以下のような課題に直面することが多くあります。

  1. 配列操作の構文が多すぎて、どれを使えばいいかわからない 配列関数は 70 種類以上存在し、適切なものを選ぶのに時間がかかります。

  2. クロージャと通常の関数の使い分けが曖昧 function()fn() の違い、use の使い方が混乱しやすいです。

  3. 型宣言の種類が増えて、どれを使うべきか迷う ?intint|stringmixed など、選択肢が多く、適切な型を選ぶのが難しくなっています。

  4. match 式と switch 文の違いがわからない いつ match を使うべきか、switch との使い分けが不明瞭です。

  5. 最新構文を使いこなせず、古いコードパターンを踏襲してしまう 新機能を知らないまま、非効率な書き方を続けてしまいます。

以下の図は、PHP 開発でよくある課題の流れを示しています。

mermaidflowchart TD
  start["新しいタスク開始"] --> check["構文を思い出せない"]
  check --> search["ドキュメント検索"]
  search --> slow["開発速度の低下"]
  slow --> old["古い書き方を踏襲"]
  old --> debt["技術的負債の蓄積"]

  check -.-> sheet["チートシート参照"]
  sheet -.-> fast["素早く実装"]
  fast -.-> modern["最新構文活用"]

これらの課題を解決するには、頻出構文を体系的に整理し、すぐに参照できる形でまとめることが必要です。

解決策

本記事では、4 つのテーマごとに構文を整理し、実務で即使えるコード例を提供します。

解決策の全体像

mermaidflowchart LR
  problem["課題:<br/>構文が多すぎる"] --> solution["解決策:<br/>4 テーマに絞る"]
  solution --> array["配列操作"]
  solution --> closure["クロージャ"]
  solution --> typeDecl["型宣言"]
  solution --> matchExpr["match 式"]

  array --> code["実践コード例"]
  closure --> code
  typeDecl --> code
  matchExpr --> code

各テーマについて、基本構文から実践的な使い方まで、段階的に解説していきます。コピー&ペーストですぐに試せるコードを中心に、図解も交えながら理解を深めていきましょう。

配列操作

PHP の配列は非常に柔軟で、リスト型と連想配列の両方として使えます。ここでは、実務で頻繁に使う配列操作をまとめました。

配列の基本操作

配列の作成

PHP 5.4 以降は、短縮構文 [] で配列を作成できます。

php<?php
// 数値インデックス配列
$numbers = [1, 2, 3, 4, 5];

// 連想配列
$user = [
    'name' => '田中太郎',
    'age' => 30,
    'email' => 'tanaka@example.com'
];

配列の作成は開発の基本中の基本ですが、短縮構文を使うことでコードがすっきりします。

従来の array() 構文よりも視覚的にわかりやすいですね。

多次元配列の作成

php<?php
// 多次元配列
$users = [
    ['name' => '田中', 'age' => 30],
    ['name' => '佐藤', 'age' => 25],
    ['name' => '鈴木', 'age' => 35]
];

ユーザーリストなど、構造化されたデータを扱う際に便利です。

要素の追加と取得

php<?php
$fruits = ['りんご', 'バナナ'];

// 末尾に追加
$fruits[] = 'みかん';
// 結果: ['りんご', 'バナナ', 'みかん']

// 特定のキーに追加
$fruits[10] = 'ぶどう';
// 結果: インデックス 10 に 'ぶどう' が追加される

配列への要素追加は、[] を使うだけのシンプルな構文です。

php<?php
// 要素の取得
$first = $fruits[0]; // 'りんご'

// 連想配列の要素取得
$name = $user['name'] ?? 'ゲスト'; // null 合体演算子で安全に取得

配列要素の操作では、null 合体演算子 ?? を使うことで、存在しないキーへのアクセスでもエラーを回避できます。

配列関数の活用

array_map - 各要素に関数を適用

すべての要素に対して同じ処理を適用したいときに使います。

php<?php
$numbers = [1, 2, 3, 4, 5];

// 各要素を 2 倍にする
$doubled = array_map(function($n) {
    return $n * 2;
}, $numbers);
// 結果: [2, 4, 6, 8, 10]

array_map は元の配列を変更せず、新しい配列を返すため、元データを保持したまま変換できます。

php<?php
// アロー関数を使った短縮版(PHP 7.4+)
$doubled = array_map(fn($n) => $n * 2, $numbers);

アロー関数を使うと、さらに簡潔に書けるようになります。

array_filter - 条件に合う要素を抽出

条件を満たす要素だけを取り出したいときに便利です。

php<?php
$numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

// 偶数のみを抽出
$evens = array_filter($numbers, function($n) {
    return $n % 2 === 0;
});
// 結果: [2, 4, 6, 8, 10]

array_filter はキーが保持されるため、必要に応じて array_values() でリセットすることを忘れないようにしましょう。

php<?php
// アロー関数版
$evens = array_filter($numbers, fn($n) => $n % 2 === 0);

こちらもアロー関数で簡潔に記述できます。

array_reduce - 配列を単一値に集約

配列の要素を順次処理して、最終的に 1 つの値にまとめます。

php<?php
$numbers = [1, 2, 3, 4, 5];

// 合計を計算
$sum = array_reduce($numbers, function($carry, $item) {
    return $carry + $item;
}, 0); // 初期値は 0
// 結果: 15

array_reduce の第 3 引数は初期値で、省略すると null になるため、明示的に指定することをおすすめします。

php<?php
// アロー関数版
$sum = array_reduce($numbers, fn($carry, $item) => $carry + $item, 0);

集計処理もアロー関数を使えば 1 行で記述できますね。

スプレッド演算子と分割代入

スプレッド演算子 - 配列の展開

PHP 7.4 から、配列のスプレッド演算子 ... が使えるようになりました。

php<?php
$arr1 = [1, 2, 3];
$arr2 = [4, 5, 6];

// 配列を展開して結合
$merged = [...$arr1, ...$arr2];
// 結果: [1, 2, 3, 4, 5, 6]

スプレッド演算子は array_merge() よりも高速で、直感的にコードが書けます。

php<?php
// 途中に要素を追加
$combined = [...$arr1, 99, ...$arr2];
// 結果: [1, 2, 3, 99, 4, 5, 6]

配列の途中に要素を挿入するのも簡単です。

分割代入 - 配列を変数に展開

配列の要素を個別の変数に一度に代入できます。

php<?php
$user = ['田中太郎', 30, 'tanaka@example.com'];

// 分割代入
[$name, $age, $email] = $user;

echo $name; // '田中太郎'
echo $age;  // 30

分割代入を使うと、配列から必要な値だけを簡潔に取り出せます。

php<?php
// 一部だけ取り出す
[$firstName, , $emailAddress] = $user;
// $firstName = '田中太郎'
// $emailAddress = 'tanaka@example.com'
// 真ん中の要素はスキップ

不要な要素はカンマで読み飛ばせるので便利ですね。

配列操作のまとめ図

以下の図は、配列操作の主な流れを示しています。

mermaidflowchart TD
  create["配列作成<br/>[1, 2, 3]"] --> operation{"操作の種類"}

  operation -->|変換| map["array_map<br/>全要素に関数適用"]
  operation -->|抽出| filter["array_filter<br/>条件に合う要素のみ"]
  operation -->|集約| reduce["array_reduce<br/>単一値に変換"]
  operation -->|結合| spread["スプレッド演算子<br/>[...$arr1, ...$arr2]"]
  operation -->|分解| destruct["分割代入<br/>[$a, $b] = $arr"]

  map --> result["新しい配列"]
  filter --> result
  reduce --> single["単一値"]
  spread --> result
  destruct --> vars["個別変数"]

図で理解できる要点:

  • 配列操作は目的に応じて 5 つのパターンに分類できる
  • array_maparray_filter は新しい配列を返す
  • array_reduce は単一値に集約する

クロージャ

クロージャ(無名関数)は、名前を持たない関数で、変数に代入したり、他の関数の引数として渡したりできます。PHP では、コールバック処理や関数型プログラミングのパターンで活用されます。

クロージャの基本

基本的な無名関数

php<?php
// クロージャを変数に代入
$greet = function($name) {
    return "こんにちは、{$name}さん!";
};

// 実行
echo $greet('田中'); // "こんにちは、田中さん!"

クロージャは変数に代入できるため、動的に関数を生成したり、条件によって異なる処理を割り当てたりできます。

use による変数のキャプチャ

外部のスコープから変数を取り込むには、use キーワードを使います。

php<?php
$tax = 0.1;

// $tax を取り込む
$calculateTotal = function($price) use ($tax) {
    return $price * (1 + $tax);
};

echo $calculateTotal(1000); // 1100

use で取り込んだ変数は、クロージャ定義時の値がコピーされます。

後から外部の $tax を変更しても、クロージャ内の値は変わりません。

参照による取り込み

変数を参照で取り込むと、外部変数の変更がクロージャ内にも反映されます。

php<?php
$count = 0;

// 参照で取り込む
$increment = function() use (&$count) {
    $count++;
};

$increment();
$increment();
$increment();

echo $count; // 3

参照を使うことで、クロージャ内で外部変数を直接変更できるようになります。

カウンタや状態管理に便利ですね。

アロー関数(PHP 7.4+)

アロー関数は、短い構文でクロージャを記述できる機能です。暗黙的に外部変数をすべて取り込むため、use が不要になります。

アロー関数の基本構文

php<?php
// 通常のクロージャ
$double = function($n) {
    return $n * 2;
};

// アロー関数(短縮版)
$double = fn($n) => $n * 2;

echo $double(5); // 10

アロー関数は 1 行で書けるため、コードがすっきりします。

アロー関数と自動キャプチャ

php<?php
$tax = 0.1;

// use が不要
$calculateTotal = fn($price) => $price * (1 + $tax);

echo $calculateTotal(1000); // 1100

アロー関数は自動的に外部変数を取り込むため、use を書く必要がありません。

ただし、参照での取り込みはできないため、外部変数を変更したい場合は通常のクロージャを使いましょう。

クロージャの実践的な使い方

コールバックとして配列関数に渡す

php<?php
$products = [
    ['name' => 'ノートPC', 'price' => 100000],
    ['name' => 'マウス', 'price' => 3000],
    ['name' => 'キーボード', 'price' => 8000],
];

// 価格だけを抽出
$prices = array_map(fn($p) => $p['price'], $products);
// 結果: [100000, 3000, 8000]

アロー関数を使うことで、配列操作のコードが非常にシンプルになります。

php<?php
// 1 万円以上の商品のみ抽出
$expensive = array_filter($products, fn($p) => $p['price'] >= 10000);
// 結果: [['name' => 'ノートPC', 'price' => 100000]]

条件抽出もアロー関数でわかりやすく記述できます。

高階関数の作成

関数を返す関数を作ることで、柔軟な処理を実現できます。

php<?php
// 倍率を指定して乗算関数を生成
function createMultiplier($factor) {
    return fn($n) => $n * $factor;
}

$double = createMultiplier(2);
$triple = createMultiplier(3);

echo $double(5); // 10
echo $triple(5); // 15

高階関数を使うと、共通のパターンを関数化して再利用しやすくなります。

クロージャとアロー関数の比較図

mermaidflowchart TD
  start["関数が必要"] --> question{"複数行の処理?"}

  question -->|はい| closure["通常のクロージャ<br/>function() use ($var) { ... }"]
  question -->|いいえ| arrow["アロー関数<br/>fn($x) => $x * 2"]

  closure --> ref{"外部変数を変更?"}
  ref -->|はい| useRef["use (&$var)"]
  ref -->|いいえ| useVal["use ($var)"]

  arrow --> auto["自動キャプチャ<br/>use 不要"]

図で理解できる要点:

  • 複数行の処理が必要なら通常のクロージャを選択
  • 1 行で済む処理はアロー関数が最適
  • 外部変数の変更が必要なら参照で取り込む

型宣言

PHP 7.0 から型宣言が導入され、PHP 8.x でさらに強化されました。型宣言を使うことで、バグの早期発見、コードの自己文書化、IDE の補完強化など、多くのメリットが得られます。

基本的な型宣言

スカラー型の宣言

php<?php
// 引数と戻り値に型を指定
function add(int $a, int $b): int {
    return $a + $b;
}

echo add(5, 3); // 8

// 型が違うとエラー
// add('5', '3'); // TypeError が発生

型宣言により、意図しない型の値が渡されたときに即座にエラーで検知できます。

複数の型宣言

php<?php
function greet(string $name): string {
    return "こんにちは、{$name}さん";
}

function calculateArea(float $radius): float {
    return pi() * $radius ** 2;
}

各関数の役割が型宣言によって明確になります。

php<?php
function isValid(bool $flag): bool {
    return !$flag;
}

function getItems(array $items): array {
    return array_filter($items, fn($item) => $item > 0);
}

型宣言により、コードの可読性が向上しています。

null 許容型

値が null になる可能性がある場合は、? を付けて null 許容型を宣言します。

php<?php
// null も許容する
function findUser(?int $id): ?array {
    if ($id === null) {
        return null;
    }

    // ユーザー検索処理
    // ...

    return ['id' => $id, 'name' => '田中'];
}

null 許容型を使うことで、null を返す可能性があることを明示できます。

php<?php
$user = findUser(null); // null が返る
$user = findUser(100);  // 配列が返る

呼び出し側で適切に null チェックを行えるようになります。

Union 型(PHP 8.0+)

複数の型のいずれかを受け入れる場合に使います。

php<?php
// int または string を受け入れる
function formatId(int|string $id): string {
    if (is_int($id)) {
        return sprintf('ID: %06d', $id);
    }
    return "ID: {$id}";
}

echo formatId(123);     // "ID: 000123"
echo formatId('ABC');   // "ID: ABC"

Union 型により、柔軟な型指定ができるようになりました。

3 つ以上の Union 型

php<?php
function process(int|float|string $value): string {
    return match(true) {
        is_int($value) => "整数: {$value}",
        is_float($value) => "小数: {$value}",
        is_string($value) => "文字列: {$value}",
    };
}

Union 型と match 式を組み合わせることで、型に応じた処理を簡潔に記述できます。

php<?php
echo process(10);      // "整数: 10"
echo process(3.14);    // "小数: 3.14"
echo process('test');  // "文字列: test"

実行結果が型によって適切に振り分けられています。

mixed 型(PHP 8.0+)

任意の型を受け入れる場合に使います。

php<?php
function dump(mixed $value): void {
    var_dump($value);
}

dump(123);          // int
dump('test');       // string
dump([1, 2, 3]);    // array
dump(null);         // null

mixed は「何でも OK」を明示的に示すため、単に型宣言を省略するよりも意図が伝わりやすくなります。

void と never 型

void - 戻り値なし

php<?php
function logMessage(string $message): void {
    echo "[LOG] {$message}\n";
    // return 文は不要、または return; のみ
}

logMessage('処理を開始しました');

void を使うことで、この関数が値を返さないことを明示できます。

never - 決して返らない(PHP 8.1+)

php<?php
// 常に例外を投げる、またはスクリプトを終了する
function abort(string $message): never {
    throw new Exception($message);
}

function redirect(string $url): never {
    header("Location: {$url}");
    exit;
}

never 型は、関数が正常に終了しないことを示します。

例外を投げる関数やリダイレクト処理などで使われますね。

プロパティの型宣言(PHP 7.4+)

クラスのプロパティにも型宣言ができます。

php<?php
class User {
    // プロパティに型を指定
    private int $id;
    private string $name;
    private ?string $email = null;

    public function __construct(int $id, string $name) {
        $this->id = $id;
        $this->name = $name;
    }

プロパティに型を付けることで、クラス内のデータの整合性が保証されます。

php<?php
    public function getId(): int {
        return $this->id;
    }

    public function getName(): string {
        return $this->name;
    }
}

$user = new User(1, '田中太郎');

型宣言により、バグを減らせるようになります。

型宣言の効果を示す図

mermaidflowchart LR
  code["型宣言を追加"] --> benefit1["バグの早期発見"]
  code --> benefit2["IDE の補完強化"]
  code --> benefit3["自己文書化"]
  code --> benefit4["リファクタリング支援"]

  benefit1 --> quality["コード品質向上"]
  benefit2 --> quality
  benefit3 --> quality
  benefit4 --> quality

図で理解できる要点:

  • 型宣言は開発効率向上に直結する
  • IDE が型情報を活用してより正確な補完を提供
  • コードが自己文書化されメンテナンス性が向上

match 式

match 式は PHP 8.0 で導入された新しい条件分岐構文です。従来の switch 文の問題点を解決し、より安全で簡潔な記述ができます。

match と switch の違い

以下の表で、主な違いを確認しましょう。

#項目switchmatch
1比較方法==(緩い比較)===(厳密な比較)
2値の返却不可(文として動作)可能(式として動作)
3break 文必要(フォールスルー防止)不要(自動で終了)
4網羅性チェックなしdefault がないと例外
5複数条件複数の case を重ねるカンマ区切りで指定

この表から、match 式が switch 文よりも安全で使いやすいことがわかります。

match の基本構文

シンプルな match 式

php<?php
$status = 'success';

// match は値を返す
$message = match($status) {
    'success' => '処理が成功しました',
    'error' => 'エラーが発生しました',
    'pending' => '処理中です',
    default => '不明なステータス',
};

echo $message; // "処理が成功しました"

match は式なので、直接変数に代入できます。

これにより、コードが簡潔になりますね。

厳密な型比較

php<?php
$value = '1';

// switch の場合(緩い比較)
$resultSwitch = match($value) {
    1 => '数値の 1',
    '1' => '文字列の 1',
    default => 'その他',
}; // '文字列の 1'

文字列の '1' が渡されているため、2 番目の条件にマッチします。

php<?php
// 厳密比較されるため、型も一致する必要がある
$number = 1;
$resultMatch = match($number) {
    1 => '数値の 1',
    '1' => '文字列の 1', // この行には到達しない
    default => 'その他',
}; // '数値の 1'

match=== で比較するため、型の違いによるバグを防げます。

複数条件の指定

カンマ区切りで複数値を指定

php<?php
$statusCode = 404;

$category = match($statusCode) {
    200, 201, 204 => '成功',
    400, 401, 403 => 'クライアントエラー',
    404 => 'Not Found',
    500, 502, 503 => 'サーバーエラー',
    default => 'その他のステータス',
};

echo $category; // "Not Found"

カンマで区切ることで、複数の条件を 1 つのアームにまとめられます。

条件式を使った match

値の比較だけでなく、条件式を評価することもできます。

php<?php
$age = 25;

// true を match して条件式を評価
$category = match(true) {
    $age < 13 => '子供',
    $age < 20 => '中高生',
    $age < 65 => '成人',
    $age >= 65 => 'シニア',
};

echo $category; // "成人"

match(true) を使うことで、複雑な条件分岐を簡潔に書けます。

match 式の実践例

HTTP ステータスコードの処理

php<?php
function getStatusMessage(int $code): string {
    return match($code) {
        200 => 'OK',
        201 => 'Created',
        204 => 'No Content',
        301, 302 => 'Redirect',
        400 => 'Bad Request',
        401 => 'Unauthorized',
        403 => 'Forbidden',
        404 => 'Not Found',
        500 => 'Internal Server Error',
        502 => 'Bad Gateway',
        503 => 'Service Unavailable',
        default => 'Unknown Status',
    };
}

よく使うステータスコードの判定が一目でわかりますね。

php<?php
echo getStatusMessage(404); // "Not Found"
echo getStatusMessage(200); // "OK"

シンプルな呼び出しで、わかりやすいメッセージが得られます。

ユーザー権限による処理の分岐

php<?php
function getPermissions(string $role): array {
    return match($role) {
        'admin' => ['read', 'write', 'delete', 'manage'],
        'editor' => ['read', 'write', 'delete'],
        'author' => ['read', 'write'],
        'subscriber' => ['read'],
        default => [],
    };
}

$permissions = getPermissions('editor');
// 結果: ['read', 'write', 'delete']

権限管理のロジックが簡潔に表現できています。

型による処理の振り分け

php<?php
function formatValue(mixed $value): string {
    return match(true) {
        is_int($value) => "整数: {$value}",
        is_float($value) => sprintf("小数: %.2f", $value),
        is_string($value) => "文字列: \"{$value}\"",
        is_array($value) => "配列(要素数: " . count($value) . ")",
        is_null($value) => "null",
        default => "その他の型",
    };
}

型判定と処理を 1 つの match 式で完結できます。

php<?php
echo formatValue(42);       // "整数: 42"
echo formatValue(3.14);     // "小数: 3.14"
echo formatValue('test');   // "文字列: "test""
echo formatValue([1, 2]);   // "配列(要素数: 2)"

さまざまな型に応じた出力を得られますね。

match 式の動作フロー図

mermaidflowchart TD
  start["match($value)"] --> compare1["条件 1 と厳密比較<br/>(===)"]
  compare1 -->|一致| result1["結果 1 を返す"]
  compare1 -->|不一致| compare2["条件 2 と厳密比較"]
  compare2 -->|一致| result2["結果 2 を返す"]
  compare2 -->|不一致| compare3["..."]
  compare3 --> defaultCheck{"default あり?"}
  defaultCheck -->|あり| resultDefault["default の結果を返す"]
  defaultCheck -->|なし| error["UnhandledMatchError<br/>例外を投げる"]

  result1 --> finish["値を返して終了"]
  result2 --> finish
  resultDefault --> finish

図で理解できる要点:

  • match は厳密比較(===)で条件を評価する
  • default がない場合は例外が発生する
  • すべてのケースを考慮する必要がある

match は default がない場合に例外を投げるため、すべてのケースを考慮する必要があります。

これにより、未処理のケースを見逃しにくくなりますね。

match 式を使うべき場面

以下のような場面で match 式が特に有効です。

  1. 厳密な型比較が必要な場合 switch の緩い比較では予期しない動作になる可能性があるとき。

  2. 値を直接返したい場合 変数への代入や return 文で値を返すとき。

  3. 複数の値を 1 つの結果にマッピングする場合 ステータスコードやエラーコードの処理など。

  4. すべてのケースを網羅したい場合 default がない場合にエラーになるため、漏れを防げます。

まとめ

本記事では、PHP の実務で頻繁に使う「配列」「クロージャ」「型宣言」「match」の 4 つの構文を、チートシートとして整理しました。

配列操作

短縮構文 []array_maparray_filterarray_reduce、スプレッド演算子 ...、分割代入など、配列を効率的に扱う方法を学びました。

これらを活用することで、コードの可読性が大きく向上します。

クロージャ

無名関数、use による変数キャプチャ、PHP 7.4 のアロー関数 fn() を使うことで、簡潔で柔軟なコードが書けるようになります。

コールバック処理や高階関数の実装に欠かせない機能ですね。

型宣言

スカラー型、null 許容型、Union 型、mixedvoidnever など、豊富な型宣言を使うことで、バグの早期発見、コードの自己文書化、IDE の補完強化といった恩恵を受けられます。

型安全性の向上は、長期的な保守性の向上につながります。

match 式

PHP 8.0 の match 式は、厳密な型比較、値の返却、複数条件の簡潔な記述など、switch 文の課題を解決した強力な構文です。

条件分岐のコードが大幅にシンプルになりますね。

これらの構文を使いこなすことで、PHP コードの品質、可読性、保守性が飛躍的に向上します。本記事を手元に置いて、開発の際にぜひ参照してください。

関連リンク