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