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() { }; | 無名関数の定義 |
| 2 | use で変数取り込み | function() use ($var) { } | 外部変数をキャプチャ |
| 3 | アロー関数 | fn($x) => $x * 2 | PHP 7.4+ の短縮構文 |
| 4 | 型宣言付き | function(int $x): int { } | 引数と戻り値に型指定 |
| 5 | コールバックとして利用 | array_map($fn, $arr) | 配列関数に渡す |
| 6 | 参照で取り込み | function() use (&$var) { } | 外部変数を参照で変更 |
型宣言 早見表
| # | 型 | 構文例 | 説明 |
|---|---|---|---|
| 1 | int | function(int $x): int | 整数型 |
| 2 | float | function(float $x): float | 浮動小数点数型 |
| 3 | string | function(string $s): string | 文字列型 |
| 4 | bool | function(bool $b): bool | 真偽値型 |
| 5 | array | function(array $arr): array | 配列型 |
| 6 | object | function(object $obj): object | オブジェクト型 |
| 7 | mixed | function(mixed $x): mixed | 任意の型(PHP 8.0+) |
| 8 | null 許容型 | function(?int $x): ?int | null も許容 |
| 9 | Union 型 | function(int|string $x) | 複数型のいずれか(PHP 8.0+) |
| 10 | void | function(): void | 戻り値なし |
| 11 | never | function(): never | 決して返らない(PHP 8.1+) |
| 12 | プロパティ型 | private int $count; | クラスプロパティに型指定 |
match 式 早見表
| # | 機能 | 構文例 | 説明 |
|---|---|---|---|
| 1 | 基本の match | match($val) { ... } | 式として値を返す |
| 2 | 単一条件 | 1 => 'one' | 値が一致したら結果を返す |
| 3 | 複数条件 | 1, 2 => 'low' | カンマ区切りで複数指定 |
| 4 | default | default => '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 開発において、以下のような課題に直面することが多くあります。
-
配列操作の構文が多すぎて、どれを使えばいいかわからない 配列関数は 70 種類以上存在し、適切なものを選ぶのに時間がかかります。
-
クロージャと通常の関数の使い分けが曖昧
function()とfn()の違い、useの使い方が混乱しやすいです。 -
型宣言の種類が増えて、どれを使うべきか迷う
?int、int|string、mixedなど、選択肢が多く、適切な型を選ぶのが難しくなっています。 -
match 式と switch 文の違いがわからない いつ match を使うべきか、switch との使い分けが不明瞭です。
-
最新構文を使いこなせず、古いコードパターンを踏襲してしまう 新機能を知らないまま、非効率な書き方を続けてしまいます。
以下の図は、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_map、array_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 の違い
以下の表で、主な違いを確認しましょう。
| # | 項目 | switch | match |
|---|---|---|---|
| 1 | 比較方法 | ==(緩い比較) | ===(厳密な比較) |
| 2 | 値の返却 | 不可(文として動作) | 可能(式として動作) |
| 3 | break 文 | 必要(フォールスルー防止) | 不要(自動で終了) |
| 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 式が特に有効です。
-
厳密な型比較が必要な場合
switchの緩い比較では予期しない動作になる可能性があるとき。 -
値を直接返したい場合 変数への代入や return 文で値を返すとき。
-
複数の値を 1 つの結果にマッピングする場合 ステータスコードやエラーコードの処理など。
-
すべてのケースを網羅したい場合 default がない場合にエラーになるため、漏れを防げます。
まとめ
本記事では、PHP の実務で頻繁に使う「配列」「クロージャ」「型宣言」「match」の 4 つの構文を、チートシートとして整理しました。
配列操作
短縮構文 []、array_map、array_filter、array_reduce、スプレッド演算子 ...、分割代入など、配列を効率的に扱う方法を学びました。
これらを活用することで、コードの可読性が大きく向上します。
クロージャ
無名関数、use による変数キャプチャ、PHP 7.4 のアロー関数 fn() を使うことで、簡潔で柔軟なコードが書けるようになります。
コールバック処理や高階関数の実装に欠かせない機能ですね。
型宣言
スカラー型、null 許容型、Union 型、mixed、void、never など、豊富な型宣言を使うことで、バグの早期発見、コードの自己文書化、IDE の補完強化といった恩恵を受けられます。
型安全性の向上は、長期的な保守性の向上につながります。
match 式
PHP 8.0 の match 式は、厳密な型比較、値の返却、複数条件の簡潔な記述など、switch 文の課題を解決した強力な構文です。
条件分岐のコードが大幅にシンプルになりますね。
これらの構文を使いこなすことで、PHP コードの品質、可読性、保守性が飛躍的に向上します。本記事を手元に置いて、開発の際にぜひ参照してください。
関連リンク
articlePHP 構文チートシート:配列・クロージャ・型宣言・match を一枚で把握
articlePHP 開発環境の作り方【完全ガイド】:macOS/Windows/Linux 別最適解
articlePHP とは?2025 年版の特徴・強み・できることを徹底解説【保存版】
articleCodeIgniterで接続しているデータベースにPHPからテーブルを作成するサンプルコード
article「Codeigniter」トラックバック受信処理について使い方とサンプル
articlePHPでフォーム送信時のCAPTCHA(画像認証) を簡単に設置できる「Securimage」の使い方とサンプル
articlePlaywright Debug モード活用:テストが落ちる原因を 5 分で特定する手順
articleVue.js でメモリリーク?watch/effect/イベント登録の落とし穴と検知法
articleTailwind CSS のクラスが消える/縮む原因を特定:ツリーシェイクと safelist 完全対策
articlePHP 構文チートシート:配列・クロージャ・型宣言・match を一枚で把握
articleSvelte ストアエラー「store is not a function」を解決:writable/derived の落とし穴
articleNext.js の 観測可能性入門:OpenTelemetry/Sentry/Vercel Analytics 連携
blogiPhone 17シリーズの発表!全モデルiPhone 16から進化したポイントを見やすく整理
blogGoogleストアから訂正案内!Pixel 10ポイント有効期限「1年」表示は誤りだった
blog【2025年8月】Googleストア「ストアポイント」は1年表記はミス?2年ルールとの整合性を検証
blogGoogleストアの注文キャンセルはなぜ起きる?Pixel 10購入前に知るべき注意点
blogPixcel 10シリーズの発表!全モデル Pixcel 9 から進化したポイントを見やすく整理
blogフロントエンドエンジニアの成長戦略:コーチングで最速スキルアップする方法
review今の自分に満足していますか?『持たざる者の逆襲 まだ何者でもない君へ』溝口勇児
reviewついに語られた業界の裏側!『フジテレビの正体』堀江貴文が描くテレビ局の本当の姿
review愛する勇気を持てば人生が変わる!『幸せになる勇気』岸見一郎・古賀史健のアドラー実践編で真の幸福を手に入れる
review週末を変えれば年収も変わる!『世界の一流は「休日」に何をしているのか』越川慎司の一流週末メソッド
review新しい自分に会いに行こう!『自分の変え方』村岡大樹の認知科学コーチングで人生リセット
review科学革命から AI 時代へ!『サピエンス全史 下巻』ユヴァル・ノア・ハラリが予見する人類の未来