PHPの無名関数についてまとめています。
無名関数について、公式ドキュメントのページはこちら(https://www.php.net/manual/ja/functions.anonymous.php)です。
無名関数とは?
無名関数はクロージャとも呼ばれ、関数名を指定しなくても使える関数です。
プログラムの中で定義して使ったり、array_map関数などのcallable引数に指定されたりします。
基本的には下記のような形になります。
$test = function() {
echo 'test';
};
function
で関数を定義していますが、名前をつけずに引数を受けて、処理を書いています。
この関数を実行したい場合には、格納した変数から関数のように呼び出します。
$test(); // test
波括弧の「}
」の後にセミコロンがないと、エラー(syntax error
)になるため注意が必要です。
無名関数を使う
無名関数を使う時には、プログラムの中でfunction
を書いてから、引数と処理を書くだけです。
引数付きの処理を書く場合は、下記のようになります。
$hello = function ($name) {
echo "{$name}さん、こんにちは!\n";
};
$name
で、ひとつの引数を取得して、処理しています。
実際に実行して使うときは、下記のようになります。それぞれ渡した引数が使われていることが確認できます。
$hello('taro'); // taroさん、こんにちは!
$hello('hanako'); // hanakoさん、こんにちは!
また、2つ以上の引数を渡す時も、通常の関数と同様に引数を並べるだけです。
下記はふたつの引数を足し算する無名関数です。
$calc = function($value1, $value2) {
return $value1 + $value2;
};
使用するときは、下記のようになります。
echo $calc(5, 10); // 15
echo $calc(23, 18); // 41
関数の引数としての無名関数
関数のcallable引数として、無名関数を使うことがあります。
array_map関数は指定した配列にコールバック関数の処理を適用して、適用後の配列を返してくれます。
第1引数がcallable引数なので、無名関数を使って下記のように定義することができます。
$fruits = ['orange', 'apple', 'banana'];
$result = array_map(function ($value) {
return "{$value}はおいしい";
}, $fruits);
var_dump($result);
array_map関数の第1引数に無名関数、第2引数に$fruits
配列を指定しています。
配列に対して、第1引数に指定した内容を適用して、配列を返してくれます。
出力結果は、下記のようになります。
array(3) {
[0]=>
string(21) "orangeはおいしい"
[1]=>
string(20) "appleはおいしい"
[2]=>
string(21) "bananaはおいしい"
}
このように、関数に渡すときのcallableの引数として使うこともあります。
外部変数を使いたいならuseを使う
外部変数を使いたい場合、無名関数の中から参照することができないので、useを使う必要があります。
例えば、下記のコードです。
$number = 100;
$outNumber = function () {
echo $number;
};
$outNumber();
$number
変数は無名関数の中では、参照することができないため、下記の警告が発生します。
PHP Warning: Undefined variable $number in xxx.php on line xx
$number
変数を参照したい場合には、下記のようにuseをつけて渡します。
$number = 100;
$outNumber = function () use ($number) {
echo $number;
};
$outNumber(); // 100
複数渡す場合には、引数と同様にカンマで区切って渡すと良いです。
無名関数で再帰処理をする
無名関数を使って、再帰処理を作ることができます。
ポイントとしては、関数を代入する変数をuseで参照渡し(&
)する必要があります。
下記が再帰処理の例です。
$addition = function ($number) use (&$addition) {
if ($number == 0) return;
return $number + $addition($number - 1);
};
echo $addition(7); // 28
渡した数値をひとつずつ引いて、それぞれを足していく再帰処理です。
渡した値が0になったら、return
で処理が終わります。
上記では、7
を渡しているので、「7 + 6 + 5 + 4 + 3 + 2 + 1
」と再帰処理で計算されます。
結果28
が出力されます。
おわりに
今回はPHPの無名関数について書きました。
プログラムの中で、function
キーワードを使って、簡単に定義できました。
また、関数の引数として使用したり、再帰処理できることが確認できました。
無名関数の処理が多いと、コードが読みづらくなるため多様は避けた方が良いかと思いますが、便利なので適宜使っていきましょう。
コメント