【PHP】無名関数・クロージャーとは? – 関数名がない関数を使う。

無名関数と呼ばれる仕組みがあります。

別名でクロージャーとも呼ばれ、関数名がない関数として知られています。

ここでは初心者向けに無名関数(クロージャー)について初心者向けに解説します。

★ 目的

  • 無名関数について理解する。
  • 無名関数を使えるようになる。

無名関数(クロージャー)とは

無名関数は名前の通り、関数名がない関数です。

構文は関数のように記述することができますが、実態はPHPにデフォルトで用意されているClosureクラスのインスタンスになります。

そのため、変数に代入したり、引数として受け取ったり、渡したりすることができます。

基本構文

無名関数を使うには『定義』と『実行』が必要です。

それぞれの基本構文は次のようになります。

無名関数の定義

function( 引数 ) {
    // 処理・・・
};

基本的には関数と同じで、違いは関数名がないことと、波括弧{}の最後にセミコロンが必要ということです。

また、代入演算子で変数に代入することができます。

変数 = function( 引数 ) {
    // 処理・・・
};

無名関数の実行

変数( 引数 );

変数に無名関数が代入されている場合、変数に続いて丸括弧()を記述することで無名関数を実行できます。

サンプルコード

次のサンプルコードをご覧ください。

ソースコード

<?php

// 足し算の無名関数
$addition = function( $x, $y ) {
    return $x + $y;
};

// 無名関数を実行
echo $addition(3, 5)."\n";

?>

実行結果

8

無名関数を使った2つの値を足し算するコードです。

各コードの解説は次の表をご覧ください。

行数概要
4行目〜6行目無名関数を$additionに代入。
9行目$additionに記憶された無名関数を実行し、出力。

『$addition(3, 5)』で無名関数を実行しており、戻り値として8が返ってきています。

無名関数を引数で渡す。

無名関数は引数での受け取りすることができます。

次のサンプルコードをご覧ください。

ソースコード

<?php

// 計算関数
function calculation($a, $b, $closure) {
    return $closure($a, $b);
}

// 計算関数の呼び出し(足し算)
$result1 = calculation(5, 7, function( $x, $y ) {
    return $x + $y;
});

// 計算関数の呼び出し(引き算)
$result2 = calculation(5, 7, function( $x, $y ) {
    return $x - $y;
});

// 結果を出力
echo "result1 = ".$result1."\n";
echo "result2 = ".$result2."\n";

?>

実行結果

result1 = 12
result2 = -2

各コードの解説は次の表をご覧ください。

行数概要
4行目〜6行目2つの値を計算するcalculation関数を定義。(計算方法は引数$closureに従う)
9行目〜11行目calculation関数を呼び出し、$result1に代入。引数の$closureには足し算を行う無名関数を渡す。
14行目〜16行目calculation関数を呼び出し、$result2に代入。引数の$closureには引き算を行う無名関数を渡す。
19行目〜20行目$result1と$result2を出力

9行目と14行目から始まるcalculation関数の呼び出しでは、第3引数に無名関数を渡しています。

実行結果からcalculation関数の処理ではそれぞれの無名関数の内容に従った計算を処理していることが分かります。

まとめ

無名関数(クロージャー)は関数名のない関数です。その実態はClosureクラスのインスタンスとなるため、変数に代入したり、引数として受け取りすることが可能です。

フレームワークなどで使われることが多いので、覚えておきましょう。