PHP5.3.0からクロージャ(無名関数)を使用できるようになっているみたいです。
PHP: 無名関数 - Manual
無名関数はクロージャとも呼ばれ、 関数名を指定せずに関数を作成できるようにするものです。 コールバック パラメータとして使う際に便利ですが、用途はそれにとどまりません。
クロージャは、変数を親のスコープから引き継ぐことができます。 引き継ぐ変数は、関数のヘッダで宣言しなければなりません。
と、文章だけではわかりにくいと思うので、コードを書くとこんな感じ。
- 名前の無い関数を作って利用する
<?php $func = function($v){ return $v * $v; }; echo $func(2)."\n"; echo $func(10)."\n"; ?>
4 100
うーん、これだとあまりありがたみが無いですよね。
- 無名関数を引数とする
<?php //$arrayの各要素を$funcに従って変換します function convert($array , $func) { foreach($array as $k => $v) { $array[$k] = $func($v); } return $array; } $array = array(10 , 20 , 30); //2倍にする $a = convert($array , function($v){ return $v * 2; } ); print_r($a); //10引く $b = convert($array , function($v){ return $v - 10; } ); print_r($b); ?>
Array ( [0] => 20 [1] => 40 [2] => 60 ) Array ( [0] => 0 [1] => 10 [2] => 20 )
よく使われるのはこういうパターンですね。ある変数に対する操作を関数として渡して、それを基に変数を操作します。配列のソートや、コールバック関数なんかに使えます。
- スコープが終了しても値を保持するクロージャ
<?php //指定された値と積算する関数を作成する function make_func($v) { return function($x) use($v){ return $x * $v; }; } $func = make_func(10); echo $func(2)."\n"; echo $func(10)."\n"; $func = make_func(-1); echo $func(2)."\n"; echo $func(10)."\n"; ?>
20 100 -2 -10
make_func()終了後も$vの値が保持されています。これはuse($v)で値を保持することを宣言しているからです。
僕はまだこのクロージャの機能は使いこなせていないのですが、覚えておいて損はないと思います。
このクロージャ(無名関数)という機能はPHP5.3.0からの機能なので、注意してください。