閉鎖は美しいです!彼らは匿名の関数に付随する多くの問題を解決し、(少なくとも私たちがPHPについて話している限り)本当にエレガントなコードを可能にします。
javascriptプログラマーは、バインドされた変数が明示的に定義されていないために、時にはそれを知らなくても常にクローズを使用します。
上記のものよりも実際の例があります。サブディメンションで多次元配列をソートしなければならないと言っても、キーは変わります。
<?php
function generateComparisonFunctionForKey($key) {
return function ($left, $right) use ($key) {
if ($left[$key] == $right[$key])
return 0;
else
return ($left[$key] < $right[$key]) ? -1 : 1;
};
}
$myArray = array(
array('name' => 'Alex', 'age' => 70),
array('name' => 'Enrico', 'age' => 25)
);
$sortByName = generateComparisonFunctionForKey('name');
$sortByAge = generateComparisonFunctionForKey('age');
usort($myArray, $sortByName);
usort($myArray, $sortByAge);
?>
警告:未テストコードは(私はPHP5.3インストール気圧を持っていない)が、それはそのようなことのようになります。
そこには1つの欠点があります。多くのPHPデベロッパーは、クロージャで対処すれば、少し力がないかもしれません。
閉鎖のnice-tyをもっと理解するために、私はあなたに別の例を与えます - 今度はjavascriptで。問題の1つはスコープとブラウザー固有の非同期です。特にwindow.setTimeout();
(または-interval)の場合は特にそうです。したがって、setTimeoutに関数を渡しますが、パラメータを指定するとコードが実行されるため、実際にパラメータを与えることはできません!
function getFunctionTextInASecond(value) {
return function() {
document.getElementsByName('body')[0].innerHTML = value; // "value" is the bound variable!
}
}
var textToDisplay = prompt('text to show in a second', 'foo bar');
// this returns a function that sets the bodys innerHTML to the prompted value
var myFunction = getFunctionTextInASecond(textToDisplay);
window.setTimeout(myFunction, 1000);
myFunctionは、種類が事前定義されたパラメータを持つ関数を返します。
正直言って、私は5.3より多くのPHPと匿名の関数/クロージャが好きです。名前空間はもっと重要かもしれませんが、ですが、セクシーではありません。
これはクロージャーにのみ使用されますか? 説明をありがとう、無名関数とクロージャの違いをわかりませんでした – SeanDowney
'use'キーワードは、[aliasing namespaces](http://php.net/manual/en/language.namespaces.importing .php)。 PHP 5.3.0のリリースから3年以上経過しても、 'function ... use'という構文は公式には文書化されていないので、クロージャは文書化されていない機能になっています。文書でさえ、[匿名関数とクロージャを混乱させる](http://php.net/manual/en/functions.anonymous.php)。私がphp.netで見つけた 'use()'の唯一の(ベータと非公式の)ドキュメントは、[RFC for closures](https://wiki.php.net/rfc/closures)でした。 –
So [関数使用クロージャがPHPで実装されたのはいつですか](http://stackoverflow.com/questions/20411631/when-was-function-closures-implemented-in-php)PHP 5.3 ?それは今何とかPHPマニュアルに書かれていますか? – rubo77