PHPプログラミングにおいて、コードをより簡潔で、かつ直感的に記述するための強力な機能が「無名関数」です。
特に、一度しか使わない処理や、他の関数の引数として関数を渡す「コールバック」処理において、その真価を発揮します。
しかし、「普通の関数と何が違うの?」「use
って何のために使うの?」といった疑問を持つ方も少なくないでしょう。
この記事では、PHPの無名関数(クロージャ)について、基本的な書き方から、親スコープの変数を引き継ぐuse
キーワードの役割、そしてPHP 7.4から導入された、さらに簡潔な「アロー関数」まで、豊富なサンプルコードと共に徹底的に解説していきます。
【本記事の信頼性】
- 執筆者は元エンジニア
- 大手プログラミングスクールのWebディレクター兼ライターを経験
- 自らも地元密着型のプログラミングスクールを運営
受講生から評判の良いプログラミングスクール
スクール |
特徴 |
受講料金 |
大手比較サイトで4年連続人気NO.1!受講生からの評判も非常に高く、Web系のエンジニアを目指すならRUNTEQ一択。 | 550,000円(給付金適用あり) | |
月単価80万円以上の現役エンジニア講師による指導!一度入会すればサポートは半永久的。 | 498,000円 | |
格安で質の高いWeb制作スキルを習得したい人におすすめ!業界最安級の料金でありながら、コミュニティやサポートが充実。 | 129,800円~ | |
完全無料でプログラミングが学べる貴重なスクール!最短1ヶ月で卒業可能。ゼロスク運営会社への就職もできる。 | 無料 | |
長期間に渡って学習し、希少人材を目指す人に最適なスクール!受講料は高いものの、高収入を得られる人材を目指せる。 | 96~132万円 |
無名関数(クロージャ)とは?
無名関数とは、その名の通り「名前を持たない関数」のことです。
通常の関数はfunction myFunction() { ... }
のように名前を付けて定義しますが、無名関数は名前を付けずに定義し、多くの場合、変数に代入したり、他の関数の引数として直接記述したりして利用します。
PHPの内部では、無名関数はClosure
という特別なクラスのオブジェクトとして扱われます。
そのため、PHPの世界では無名関数のことを「クロージャ」と呼ぶのが一般的です。
通常の関数との比較
<?php
// 通常の名前付き関数
function sayHello($name) {
return "Hello, " . $name;
}
// 無名関数を変数に代入
$sayGoodbye = function($name) {
return "Goodbye, " . $name;
};
echo sayHello('Yamada'); // "Hello, Yamada" を出力
echo "<br>";
echo $sayGoodbye('Sato'); // "Goodbye, Sato" を出力
?>
このように、無名関数は変数に代入することで、その変数名を使って後から呼び出すことが可能になります。
関数を「値」として扱えるのが大きな特徴と言えるでしょう。
無名関数の基本的な使い方
無名関数の最も代表的な使われ方は、他の関数の引数として渡される「コールバック関数」としての役割です。
特に、配列を操作する多くの標準関数で活用されます。
ここでは、配列の各要素に特定の処理を適用するarray_map
関数を例に見ていきましょう。
サンプルコード
<?php
$numbers = [1, 2, 3, 4, 5];
// array_mapの第二引数に、無名関数を直接記述する
$squared_numbers = array_map(function($n) {
return $n * $n;
}, $numbers);
print_r($squared_numbers);
?>
実行結果
Array
(
[0] => 1
[1] => 4
[2] => 9
[3] => 16
[4] => 25
)
ソースコードの解説
array_map
は、第一引数に処理内容を定義した関数(コールバック関数)、第二引数に対象となる配列を受け取ります。
そして、配列の要素を一つずつコールバック関数に渡し、その戻り値で新しい配列を作成します。
この例では、array_map
のためだけにfunction($n) { return $n * $n; }
という二乗する処理を定義しています。
もし無名関数がなければ、この処理のためだけにわざわざ名前付きの関数を別に定義する必要があり、コードが冗長になってしまいます。
無名関数を使うことで、処理を行いたいその場で関数を定義できるため、コードが非常に簡潔で直感的になるのです。
親スコープの変数を引き継ぐ use キーワード
無名関数には一つ重要なルールがあります。
それは、デフォルトでは、無名関数の外側で定義された変数(親スコープの変数)にアクセスできないという点です。
この制約を解決し、外部の変数を無名関数内で使えるようにするのがuse
キーワードです。
サンプルコード
<?php
$numbers = [1, 2, 3, 4, 5, 6, 7, 8];
$threshold = 5; // 閾値
// $thresholdより大きい値だけをフィルタリングする
$filtered_numbers = array_filter($numbers, function($n) use ($threshold) {
return $n > $threshold;
});
print_r($filtered_numbers);
?>
実行結果
Array
(
[5] => 6
[6] => 7
[7] => 8
)
ソースコードの解説
この例では、配列$numbers
から、変数$threshold
に格納された5
より大きい値だけを取り出しています。
array_filter
に渡す無名関数の中で$threshold
変数を比較条件として使いたいのですが、そのままではアクセスできません。
そこで、function($n) use ($threshold)
のようにuse
キーワードを使い、外部の変数$threshold
を関数内に「引き継ぐ」ことを明示しています。
これにより、関数内で$threshold
の値を参照できるようになるのです。
ちなみに、use
で引き継いだ変数を関数内で変更したい場合は、use (&$variable)
のようにアンパサンド(&
)を付けた「参照渡し」を行う必要があります。
【PHP 7.4+】より簡潔なアロー関数
PHP 7.4からは、無名関数をさらに短く、簡潔に記述するための「アロー関数」という構文が導入されました。
アロー関数には、以下のような大きな特徴があります。
fn(引数) => 式
という形式で記述する。- 関数内の処理は単一の式でなければならず、その式の評価結果が自動的に戻り値となる。
use
キーワードを使わなくても、親スコープの変数に自動でアクセスできる。
サンプルコード
先ほどのarray_map
の例をアロー関数で書き直してみましょう。
<?php
$numbers = [1, 2, 3, 4, 5];
// アロー関数を使って書き直した例
$squared_numbers = array_map(fn($n) => $n * $n, $numbers);
print_r($squared_numbers);
?>
実行結果は先ほどの例と全く同じです。function
やreturn
、波括弧{}
などがなくなり、コードが劇的に短くなったことが分かります。
use
キーワードが不要になる点も非常に強力です。先ほどのarray_filter
の例も、以下のように書き換えられます。
<?php
$numbers = [1, 2, 3, 4, 5, 6, 7, 8];
$threshold = 5;
// アロー関数ではuseが不要
$filtered_numbers = array_filter($numbers, fn($n) => $n > $threshold);
print_r($filtered_numbers);
?>
このように、処理が1行の式で完結するようなシンプルなコールバック関数では、アロー関数を使うことでコードの可読性と記述効率を大幅に向上させることができます。
無名関数はいつ使うべきか?
ここまでの内容で、無名関数の便利さが伝わったかと思いますが、ではどのような場面で使うのが最適なのでしょうか。
主な用途は以下の通りです。
【コールバック関数として】
array_map
, array_filter
, usort
といった配列操作関数や、イベント駆動型のライブラリなどで、その場限りの処理を渡す場合に最適です。
【一度しか使わない単純な処理に】
プログラム全体で何度も再利用するわけではない、特定の箇所で一度だけ使いたい処理のために、わざわざ名前付きの関数を定義するのは冗長です。無名関数を使えば、必要な場所で処理を完結させることができます。
【クロージャとして状態を保持したい場合に】
use
キーワードを使って外部の変数の状態を「キャプチャ」し、後から実行するような、より高度な使い方もあります。
基本的には、「その場で使い捨てたい、比較的シンプルな処理」に無名関数を使う、と覚えておくと良いでしょう。
まとめ
今回は、PHPの無名関数について、その基本から応用までを詳しく解説しました。
なお、PHPを体系的に学んだり、PHPのスキルを高めたりするためには、プログラミングスクールを利用するのも有効です。
細かな疑問がすぐに解決するだけでなく、現役エンジニアが「質の高いポートフォリオ」を作成するための手助けをしてくれたり、エンジニア就職・転職のコツを教えてくれたりするなど、様々なメリットがありますので、独学に疲れた方は検討してみてはいかがでしょうか。