スキップしてメイン コンテンツに移動

PHP8クロージャで即時関数

PHP8クロージャで即時関数

クロージャと無名関数の基本

PHP8 では無名関数(anonymous function)を使って簡潔に関数を定義できます。無名関数は function() で宣言し、必要に応じて use キーワードで外部変数をキャプチャします。これがクロージャ(closure)です。以下は典型的な例です。

$y = 10;
$adder = function($x) use ($y) {
    return $x + $y;
};
echo $adder(5); // 15

上記のコードでは、$y を外部スコープからキャプチャし、$x と組み合わせて計算しています。クロージャは関数を変数に代入できるため、関数を引数に渡すコールバックとしても頻繁に利用されます。

高階関数とコールバックの活用

高階関数(higher-order function)とは、関数を引数に取る、または関数を返す関数のことです。PHP の array_maparray_filter は代表的な高階関数です。無名関数をコールバックとして渡すことで、配列操作を柔軟に行えます。

$numbers = [1, 2, 3, 4];
$squared = array_map(function($n) {
    return $n * $n;
}, $numbers);
print_r($squared); // [1, 4, 9, 16]

PHP8 では arrow function(短縮構文)も導入され、さらに簡潔に書けます。

$squared = array_map(fn($n) => $n * $n, $numbers);

また、usort も高階関数の一例です。配列の要素を任意の比較関数でソートできます。

$people = [
    ['name' => 'Alice', 'age' => 30],
    ['name' => 'Bob', 'age' => 25],
];
usort($people, function($a, $b) {
    return $a['age'] <=> $b['age'];
});
print_r($people);

このように、無名関数とコールバックを組み合わせることで、コードの再利用性と可読性が大幅に向上します。

スコープと即時関数で実現する柔軟性

クロージャはスコープを持つため、外部変数を安全に扱えます。さらに、即時関数(IIFE: Immediately Invoked Function Expression)を使うと、スコープを限定した状態で処理を実行できます。以下は典型的な IIFE の例です。

$now = (function() {
    return date('Y-m-d H:i:s');
})();
echo $now; // 2026-01-09 12:34:56

IIFE は変数の衝突を防ぎ、モジュール化されたコードを書く際に便利です。PHP8 では、クロージャの型宣言や戻り値の型ヒントもサポートされているため、より安全にスコープを管理できます。

まとめると、PHP8 のクロージャと無名関数は、関数を第一級オブジェクトとして扱える強力なツールです。function() use で外部変数をキャプチャし、array_mapusort のような高階関数と組み合わせることで、柔軟で再利用性の高いコードを書けます。さらに、即時関数を活用すれば、スコープを限定した安全な実装が可能です。ぜひプロジェクトで試してみてください。

この記事はAIによって作成されました。

コメント