変数に関数
こんなコードを見たことはありませんか。
$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が出る