クロージャは無名関数(名前のない関数で、変数に保存される)です。callableは、PHPが関数として呼び出せるもの — クロージャ、名前付き関数、メソッド、またはinvokableオブジェクト — です。これらは関数型プログラミングスタイル、コールバック、高階関数を可能にします。
クロージャ(無名関数)
= {
* ;
};
();
= * ;
();
クロージャは、保存して回し回すことができる無名関数です。アロー関数(fn)は、外側の変数を自動的にキャプチャする簡潔な形式です。
$factor = 10;
// traditional closure — must explicitly import variables with `use`
$multiply = function (int $x) use ($factor): int {
return $x * $factor; // $factor captured by value
};
// arrow function — captures outer variables AUTOMATICALLY (no `use` needed)
$multiply = fn(int $x): int => $x * $factor;
キーポイント: 従来のクロージャは外側の変数をキャプチャするために明示的なuse句が必要ですが、アロー関数は自動的にキャプチャします — 短いコールバックに対する大きな利便性です。
// these are all callables, usable as callbacks:
'strlen' // a string naming a function
[$object, 'methodName'] // [object, method] array
['ClassName', 'staticMethod'] // [class, static method]
fn($x) => $x * 2 // a closure/arrow function
$invokableObject // an object with __invoke()
// used with higher-order functions:
array_map(fn($x) => $x * 2, [1, 2, 3]); // [2, 4, 6]
array_filter($users, fn($u) => $u->isActive()); // filter
usort($items, fn($a, $b) => $a->price <=> $b->price); // custom sort
callableは、任意のcallableを受け入れるパラメータの型ヒントです — 高階関数(関数を受け取る関数)を有効にします。これはarray_map/array_filter/usortとコールバックベースのAPIの基礎です。
クロージャとcallableは、関数型プログラミングスタイル、コールバック、高階関数を可能にする重要なPHP機能です — これらはモダンPHPで常に使用されるパターンです。
クロージャ(変数に保存される無名関数)、そして特にアロー関数(fnで、従来のクロージャのように明示的なuse句を必要とさずに外側の変数を自動キャプチャする)を理解することは、日常的な知識です。なぜなら、配列関数(array_map/array_filter/array_reduce)、カスタムソート(usort)、イベントハンドラ、コールバックベースのAPIに渡される短いインライン関数を書くための自然な方法だからです。
callableが何として数えられるか(名前付き関数、メソッド、静的メソッド、クロージャ、invokableオブジェクト)を知ること、そして高階関数がそれらをどのように受け入れるかを知ることは、クリーンな関数型スタイルPHPを書き、コールバック(ルートハンドラ、コレクションメソッド、ミドルウェア)を取る多くのフレームワークとStandard LibraryのAPIを使用するための鍵です。
クロージャとcallableは表現力豊かなモダンPHPの基本です — データ変換、フィルタリング、ソート、およびコールバックパターンを簡潔で読みやすくします — したがって、それらをマスターすること、特に便利なアロー関数構文とuseによる明示的キャプチャ vs 自動キャプチャの区別を理解することは、生産的なPHP開発のための実用的で頻繁に応用される知識です。