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