PHP5.3の無名関数とクロージャ
いつのまにかPHP5.3がリリースされていたので無名関数とクロージャをちょこっと使ってみた。
まずは簡単な例から。
$foo = function() {
echo 'hoge';
};
$foo(); // hoge
変数に代入しないで実行はできないみたい。
function() {
echo 'hoge';
}(); // syntax error
(function() {
echo 'hoge';
})(); // syntax error
次のコードは動きません(何も出力されない)。$hogeが$fooの中で参照できないからです。
$hoge = 'hoge';
$foo = function() {
echo $hoge;
};
$foo(); //
外部の変数を参照するにはuseで渡します。
$hoge = 'hoge';
$foo = function() use($hoge) {
echo $hoge;
};
$foo(); // hoge
こんなかんじのクロージャもちゃんと動きます。
$foo = function($a) {
return function($b) use($a) {
return $a + $b;
};
};
$f = $foo(10);
echo $f(5); // 15
echo $f(100); // 110
次のコードはうまく動きません。これだとクロージャ内で外部の変数が変更できません。
$foo = function() {
$i = 0;
return function() use($i) {
return $i++;
};
};
$f = $foo();
echo $f(); // 0
echo $f(); // 0
echo $f(); // 0
echo $f(); // 0
echo $f(); // 0
外部の変数をクロージャ内で変更するには参照で渡します。
$foo = function() {
$i = 0;
return function() use(&$i) {
return $i++;
};
};
$f = $foo();
echo $f(); // 0
echo $f(); // 1
echo $f(); // 2
echo $f(); // 3
echo $f(); // 4
無名関数の便利ー。
- Prev Entry:sfThumbnailPluginでサムネイル画像を作る
- Next Entry:JooseでロールオーバーのJavascript書いてみた