http://jp.php.net/manual/ja/functions.anonymous.php
> 無名関数はクロージャとも呼ばれ、 関数名を指定せずに関数を作成できるようにするものです。
???
実はクロージャの意味が未だによくわからないんですよね。
よくわからないのでとりあえず使ってみましょう。
例題は大昔に使ったusort()です。
このような作りってjQueryでよく見ますね。
jQueryは大概クロージャであるという認識でよいのでしょうか。
というかこれはただの無名関数で、定義された環境がなんちゃらというクロージャの定義を満たしてない気がします。
そこんとこどうなのでしょう。
ということで呼び出す度にカウントを行うお約束なクロージャを作ってみます。
こちらのJavaScript用クロージャを剽窃参考に実装。
あれれ?
あれー?
あとJavaScriptみたいな
なお正解は、
&が一文字増えました。
ちなみに、
これは静的変数というもので、クロージャとは更に別物の話みたいです。
																					
																						> 無名関数はクロージャとも呼ばれ、 関数名を指定せずに関数を作成できるようにするものです。
???
実はクロージャの意味が未だによくわからないんですよね。
よくわからないのでとりあえず使ってみましょう。
例題は大昔に使ったusort()です。
	$product = array(
		array('name'=>'みかん','price'=>'60'),
		array('name'=>'りんご','price'=>'180'),
		array('name'=>'バナナ','price'=>'48'),
		array('name'=>'いちご','price'=>'590'),
		array('name'=>'ぶどう','price'=>'298'),
		array('name'=>'ドリアン','price'=>'5000')
	);
	
	usort($product,
		function($a,$b){
			if($a['price']==48){
				return -1;
			}else if($b['price']==48){
				return 1;
			}else{
				return 0;
			}
		}
	);
あれ、もしかしてcompare()のとこに全部突っ込んだだけ?このような作りってjQueryでよく見ますね。
jQueryは大概クロージャであるという認識でよいのでしょうか。
というかこれはただの無名関数で、定義された環境がなんちゃらというクロージャの定義を満たしてない気がします。
そこんとこどうなのでしょう。
ということで呼び出す度にカウントを行うお約束なクロージャを作ってみます。
こちらのJavaScript用クロージャを
	$countPlus = function(){
		$cnt = 1;
		return function() use ($cnt){
			print($cnt++);
		};
	};
	
	$countPlus();
	$countPlus();
	$countPlus();
何も表示されません。あれれ?
	function dummy(){
		$cnt = 1;
		return function() use ($cnt){
			print($cnt++);
		};
	};
	$countPlus = dummy();
	$countPlus();
	$countPlus();
	$countPlus();
「111」になってしまいます。あれー?
あとJavaScriptみたいな
	$countPlus = function(){ /* */ }();
という定義直後の実行はできないみたいです。残念。なお正解は、
	function dummy(){
		$cnt = 1;
		return function() use (&$cnt){
			print($cnt++);
		};
	};
	$countPlus = dummy();
	$countPlus();
	$countPlus();
	$countPlus();
です。&が一文字増えました。
ちなみに、
	$countPlus = function(){
		static $cnt = 1;
		print($cnt++);
	};
	
	$countPlus();
	$countPlus();
	$countPlus();
こう書いても思ったとおりに動作します。これは静的変数というもので、クロージャとは更に別物の話みたいです。
PR
							