クロージャにパラメータがあるのはいつですか(またはパラメータ付きのクロージャはどのように機能しますか)?これは無名関数の外部に変数をインポートuse()
するために使用されることは知っていますが、クロージャー自体のパラメーターはどうですか?
4 に答える
パラメータを使用したクロージャの例は、カリー化です。
function greeter($greeting)
{
return function($whom) use ($greeting) {
// greeting is the closed over variable
return "$greeting $whom";
};
}
$hello_greeter = greeter('hello');
echo $hello_greeter('world'); // will print 'hello world';
このgreeter
関数は、常に同じ挨拶で始まり、その後に渡されるもの(たとえば、挨拶する人)が続く「半分実装された」関数を返します。
匿名関数をパラメーターとして受け入れる関数を使用している場合は、関数のドキュメントを確認してください。
関数があなたによって書かれた場合、あなたはコントローラーであり、あなたがそれを決定します。
パラメータを持つ必要があるPHP関数に渡されるクロージャについては、ドキュメントで詳しく説明されています。この良い例は、ですarray_walk()
。これは、コールバックをiterableに適用するために使用されます。
$arr = array('a', 'b', 'c');
array_walk($arr, function($key, $val) {
echo $key . ' => ' . $val . "\n";
});
ドキュメントでは、渡される呼び出し可能オブジェクトに含める必要のあるパラメーターarray_walk()
について、「パラメーター」で詳しく説明しています。それは言う:
通常、funcnameは2つのパラメーターを取ります。配列パラメーターの値が最初で、キー/インデックスが2番目です。
多くの場合、PHPドキュメントの他の関数にも同様のヒントがあります。のドキュメントがそれほど詳細ではなかったことに失望しましたが、array_map()
十分なクロージャパラメータのドキュメントを備えた呼び出し可能オブジェクトを除いた他の関数があったことを覚えています。
callback
クロージャ(または呼び出すことができる他の値)を受け入れ、必要なパラメータを指定する独自の関数を作成する場合は、 PHP5.3またはPHP5.4でtypehintを使用できますcallable
。
function gobblesUpCallable(callable $func) {
call_user_func($func); // Use this, someone could pass in a callable string or array
}
ただし、パラメータを指定するには、を使用する必要があります。つまり、を使用する必要がReflectionClass
ありReflectionFunction
ますcall_user_func()
。
use()
パラメータとして関数を必要とする関数に特に役立ちます。渡された関数は2つのパラメーターのみを取り、余分なパラメーターは単に無視される必要がある場合があります。この場合、を使用use()
して、現在のスコープからanon関数に変数を「インポート」します。
$myvar = 10;
$fun = function(&$val, $index) use ($myvar) {$val += $myvar;};
$testArray = array(1,2,3);
array_walk($testArray, $fun);
var_dump($testArray); // 11, 12, 13
注:anon関数のシグネチャがfunction(&$val, $index, $myvar)
代わりに使用された場合、その余分な3番目のパラメーターは未使用で未定義であるためwarnings
、anon関数をで使用すると定数になります。array_walk
したがって、use()
代わりにその追加パラメータを渡すために使用します。
編集:参照によって変数を渡すこともできますuse()
...
$myvar = 10;
$fun = function(&$val, $index) use (&$myvar) {$myvar = 1; $val += $myvar;};
$testArray = array(1,2,3);
array_walk($testArray, $fun);
var_dump($testArray); // 2, 3, 4
echo $myvar; // 1