基本
無名関数(anonymous function)はfunction()
で定義。無名関数はクロージャ―(closure)とも呼ばれる。
1 2 3 4 5 |
$closure = function() { echo 'I am a closure.', PHP_EOL; }; $closure(); // I am a closure. |
戻り値を返す例。
1 2 3 4 5 |
$closure = function() { return 'A closure returning string' . PHP_EOL; }; echo $closure(); // A closure returning string |
引数をとる例。
1 2 3 4 5 6 |
$double = function($num) { $result = $num . ' times 2 equals ' . $num * 2 . PHP_EOL; return $result; }; echo $double(9); // 9 times 2 equals 18 |
use~エンクロージャーの変数
クロージャ―の外側(エンクロージャー)のスコープの変数をクロージャ―内で使う場合は、use
を加える。
1 2 3 4 5 6 7 8 9 10 |
$call = 'Hello'; $greet = function($name) use($call) { echo $call, ', ', $name, '!', PHP_EOL; }; $call = 'Hi'; $greet('John'); // Hello, John! |
use
で持ち込まれるエンクロージャーの変数の値は、関数定義前に定義された内容。上の例では$greet
に関数が定義される前の'Hello'
が使われていて、実行前の'Hi'
は使われない。
コールバック
無名関数を使ったコールバック
以下の関数は、引数$callback
を関数として想定し、その引数に$name
を与えた結果を表示する。
1 2 3 |
function greet($name, $callback) { echo $callback($name) . PHP_EOL; } |
$name
に文字列'Jane'
を与え、$callback
に無名関数を与えて実行。この無名関数は引数の$name
を使って"Hi, $name"
とい文字列を返す。
1 2 3 4 |
greet('Jane', function($name) { return 'Hi, ' . $name; }); // Hi, Jane |
$callback
に違う動作をする無名関数を与えて実行。この無名関数は引数の$name
を使って"Hello $name. How arey you?"
という文字列を返す。
1 2 3 4 |
greet('George', function($name) { return 'Hello ' . $name . '. How are you?'; }); // Hello George. How are you? |
変数に定義した無名関数のコールバック
コールバックを都度無名関数で定義するのではなく、あらかじめ変数に定義しておいた関数を渡すことができる。
これによって、メッセージのディスパッチなどが柔軟に行えるようになる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<?php $callback1 = function($name) { echo 'callback1 usese ', $name, ' for a message.', PHP_EOL; }; $callback2 = function($name) { echo 'callback2 uses ', $name, ' for another message.', PHP_EOL; }; function dispatch($name, $callback) { $callback($name); } dispatch('Allen', $callback1); // callback1 usese Allen for a message. dispatch('Ben', $callback2); // callback2 uses Ben for another message. |
可変関数によるコールバック
コールバックを可変関数で実装した例が以下の通り。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
function callback1($name) { echo 'callback1 usese ', $name, ' for a message.', PHP_EOL; } function callback2($name) { echo 'callback2 uses ', $name, ' for another message.', PHP_EOL; } function another_dispatch($name, $callback) { $callback($name); } another_dispatch('Allen', 'callback1'); // callback1 usese Allen for a message. another_dispatch('Ben', 'callback2'); // callback2 uses Ben for another message. |
なお、無名関数を変数に代入した場合の変数名とfunction
で定義した関数名は重複してもエラーとならない。
array_map()の例
コールバックを使った内部関数にarray_map()
がある。
array_map($callback, $array);
コールバックで直接無名関数を定義し、配列の各要素の自乗を要素とする配列を計算させる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<?php $array = range(1, 5); $mapped_array = array_map(function($n) { return $n * $n; }, $array); var_export($mapped_array); echo PHP_EOL; // array ( // 0 => 1, // 1 => 4, // 2 => 9, // 3 => 16, // 4 => 25, // ) |
もちろん引数のコールバックに、変数に定義した関数や可変関数を用いることもできる。