2016-05-27 7 views
6

私はPHPを使ってWeb開発を学んできましたが、私は匿名関数について少し混乱しています。具体的には、パラメータの受け渡しや、そのような関数の内部での動作について説明します。例えば は、コード匿名関数の理解PHP

$array = array("really long string here, boy", "this", "middling length", "larger"); 
usort($array, function($a, $b) { 
return strlen($a) - strlen($b); 
}); 
print_r($array); 

に私は本当にパラメータ$a$bの使用方法を得ることはありません。私は彼らが比較のために配列をソートするために配列をソートすると思います。私は、パラメータを関数に直接渡され、乗算の結果を返すために使用されて知っている次の1

$mult = function($x) 
{ 
return $x * 5; 
}; 
echo $mult(2); 

のようなコードで
。このpost
変数$valから取られ

$arr = range(0, 10); 
$arr_even = array_filter($arr, function($val) { return $val % 2 == 0; }); 
$arr_square = array_map(function($val) { return $val * $val; }, $arr); 

の例?

のは、この例を見てみましょう私は多分、これはそれが思ったほど複雑ではありません知っているが、私は機能のこの種

+1

一般的には、外部関数のドキュメントをphpや[array.reduce](httpsなど)で検索する必要があります。たとえば、[array_map](http://php.net/manual/en/function.array-map.php) ://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce)を使用して、提供するコールバックにどのパラメータが渡されるかを知ることができます。 – James

答えて

9
usort($array, function($a, $b) { 
    return strlen($a) - strlen($b); 
}); 

上のパラメータの使用について本当に困惑しています。関数をusort()に渡すと、PHP は内部的にという名前の配列を2つの要素で呼び出すことで、どちらが大きいか小さいかを調べることができます。

$a$b値は内部usort()機能から来ます。そのコードは2つのパラメータで指定された関数を呼び出します。あなたのパラメータは$a$bという名前を付ける必要はありませんが、好きなように名前を付けることができます。

+2

そして、特定のパラメータセットを持つ配列内の無名関数を呼び出す場合は、 '$ anonymous($ var1、$ var2)'または '$ result = call_user_func($ anonymous、$ var1、$ var2) ' – h2ooooooo

+0

ええ、それを変数に代入するか、直接呼び出してください。だから、基本的には、2つの引数は関数を介して内部的に管理され、私はそれらを供給する必要があり、呼び出し側はその魔法を行うでしょうか? –

+0

@Kronos: "引数"は関数yesで処理されます。 'usort()'のコードのどこかに '$ pos = $ callback($ arr [0]、$ arr [1]);'のような行があります。それはあなたの関数が呼び出されたときの引数です。 (注意:ちょうど例として、私はちょうど例として、それは*文字通り 'の')のコードではありません* –

1

あなたの質問は実際には匿名関数ではなく、コールラブルを渡すことについてです。

はのは

usort($array, function($a, $b) { 
return strlen($a) - strlen($b); 
}); 

検討中で、あなたの最初の例を見てみましょうのは、名前の関数と匿名関数を置き換えることによって、それを少しリファクタリングしてみましょう。

function compareAB($a, $b) { 
return strlen($a) - strlen($b); 
} 

usort($array, 'comapreAB'); 

あなたはまだ$a$bが渡される方法を尋ねることができます見ての通り。

答えは非常に簡単です。 usortは、2つの引数をとり、内部的に呼び出すコール可能な関数を提供することを想定しています。

+0

しかし、それはPHPの組み込み関数でのみ発生しますか?では、ユーザー定義の呼び出し可能関数はどのように機能しますか? –