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