エンジニアのひよこ_level10

【毎日更新!】新卒3年目エンジニアブログです!

【PHP】無名関数・クロージャ。変数に関数を入れたり出来る【734日目】

変数に関数

こんなコードを見たことはありませんか。

$func = function ($num) {
    return $num *2;
};
$arr = [
    'id'  => 1,
    'item' => function ($num) {
                return $num *  2;
             }
];
$mul_num = 3;

$func_use = function ($num) use ($mul_num) {
    return $num * $mul_num * 2;
};

こんなふうに、メソッドとかじゃなく、
functionだけで書かれていたり、
そのfunctionを変数に入れていたり。

公式ドキュメント

https://www.php.net/manual/ja/functions.anonymous.php

無名関数・クロージャ

無名関数や、クロージャと呼ばれているものです。

$func = function ($num) {
    return $num *2;
};

この時点で、$funcには、 Closureというクラスが入れられています。
間違えてはいけないのは、『まだ実行はされていなくて、Closureというクラスのインスタンスがある』ということ。
つまり、『実行は後で行われる』のです。

実際に実行する

ではどう扱うのか。

echo $func(3); // 結果は6って出る

$funcの中身を見るとわかりますが、$numに3が代入され、実際に動作がされます。

あくまで実行するものを保存するのであって、実行はあとで行われるのですね。

よくある質問。

Q. function ($num)の値は何が入るんだ
A. 動かす瞬間に代入された値で決まります
Q.  呼び出す前に別の所で使ってた値をクロージャ内で使いたい
A. useを使います。下の例のような感じです。
$num_x = 3;

$func = function ($num) use ($num_x) {
    return $num * $num_x;
}

echo $func(6); //18が出る