PHPの無名関数についてまとめ!外部変数の参照はuseで!

PHP

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キーワードを使って、簡単に定義できました。

また、関数の引数として使用したり、再帰処理できることが確認できました。
無名関数の処理が多いと、コードが読みづらくなるため多様は避けた方が良いかと思いますが、便利なので適宜使っていきましょう。

コメント

タイトルとURLをコピーしました