Edited at

PHPのクロージャ

More than 3 years have passed since last update.

PHPで関数を変数に代入することができると、最近知りました。

こんな感じで使えます。

$func = function() {

echo 'hello';
}; // 変数の右辺なので、「;」が必要っぽい

$func(); // hello

お、これはもしかして、JavaScriptにあるようなクロージャもできるのでは?と思ったのですが・・・。

$func = function() {

$x = 0;
return function() use($x) {
return ++$x;
};
};

$func2 = $func();
echo $func2(); // 1
echo $func2(); // 2かと思いきや、1
echo $func2(); // 3かと思いきや、1
echo $func2(); // 4かと思いきや、1

あれー?(´・ω・`)

ちょっと調べたところ、マニュアルの無名関数のところに、


引き継がれた変数の値は、関数が定義された時点のものであり、

関数が呼ばれた時点のものではありません


とあったので、できないっぽいです。

追記:

@mpywさんのコメントにより、動かすことができました!ありがとうございます!!

動いたコードはこんな感じです。

$func = function() {

$x = 0;
return function() use(&$x) {
return ++$x;
};
};

$func2 = $func();
echo $func2(); // 1
echo $func2(); // 2
echo $func2(); // 3

そうかー、ポインタ渡せば良かったのかー・・。

コメントにある@mpywさんのコードのほうがシンプルなので、そちらも参考にすると良いと思います。