忍者ブログ
[PR]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。



2017/05/27 13:22 |
PHP5.3 クロージャ
http://jp.php.net/manual/ja/functions.anonymous.php
> 無名関数はクロージャとも呼ばれ、 関数名を指定せずに関数を作成できるようにするものです。

???

実はクロージャの意味が未だによくわからないんですよね。
よくわからないのでとりあえず使ってみましょう。
例題は大昔に使った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


2012/10/26 23:59 | Comments(0) | PHP

コメント

コメントを投稿する






Vodafone絵文字 i-mode絵文字 Ezweb絵文字 (絵文字)



<<Minecraft1.3.2 装飾ブロック v1.0.2 面白装飾ブロック | HOME | Minecraft1.3.2 AnotherRecipes v1.1.0 HardcorePlusのためのアナザーレシピ>>
忍者ブログ[PR]