Webtech Walker

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

無名関数の便利ー。

このエントリーをはてなブックマークに追加