15
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

PHPのクロージャ

Last updated at Posted at 2015-01-24

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さんのコードのほうがシンプルなので、そちらも参考にすると良いと思います。

15
13
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?