web-dev-qa-db-ja.com

なぜ無名関数を使うのですか?

可能性のある複製:
PHPで匿名関数をどのように使用しますか?

なぜ無名関数を使用する必要があるのですか?つまり、それを使用する本当の取引は何ですか?私は本当にこれを手に入れません。つまり、関数を使用してコードをよりクリーンにするか、複数回使用します。しかし、無名関数は、前者も後者も行いません。私はそれらをグーグルで調べました、そして、同じ問題を尋ねている人を見つけることができませんでした。

46
Shoe

匿名関数は、それらを使用する優れたライブラリクラス/関数がある場合に、その美しさを示すと言えます。彼ら自身はそれほどセクシーではありません。 .netの世界では、LINQと呼ばれるテクノロジーがあり、当時のことを非常に慣用的に使用しています。 PHPに戻ります。

最初の例、並べ替え:

uasort($array, function($a, $b) { return($a > $b); });

ソートの複雑なロジックを指定できます。

uasort($array, function($a, $b) { return($a->Age > $b->Age); });

もう一つの例:

$data = array( 
        array('id' => 1, 'name' => 'Bob', 'position' => 'Clerk'), 
        array('id' => 2, 'name' => 'Alan', 'position' => 'Manager'), 
        array('id' => 3, 'name' => 'James', 'position' => 'Director') 
); 

$names = array_map( 
        function($person) { return $person['name']; }, 
        $data 
);

名前の配列をどれだけうまく作成できるかがわかります。

最後の一つ:

array_reduce(
   array_filter($array, function($val) { return $val % 2 == 0; },
   function($reduced, $value) { return $reduced*$value; }
)

偶数の積を計算します。

いくつかの哲学。機能とは何ですか?呼び出すことができる機能の単位とコードの再利用の単位。場合によっては、最初の部分だけを必要とすることがあります。それは、アクションを呼び出して実行する機能ですが、まったく再利用したくなく、コードの他の部分から見えるようにしたくもありません。これが、無名関数が本質的に行うことです。

60
Andrey

特にコールバックに役立ちます:

array_walk($myArray, function($value, $key) {
   // do something
});
21
netcoder

通常、一度だけ必要な関数には無名関数を使用します。この方法では、関数の名前空間を汚染せず、array_walk_callback1のような奇妙な関数名を作成しません。

7
NikiC

おそらく最も明白な理由は、コールバックの使用です。 usort()関数を例にとります。 1回だけ使用される1行の関数を導入しても意味がありません。匿名関数(通常)はこのタスクに適しています。

5
Mchl

匿名関数を変数に保存して渡すことができます。

$a=function() {
    echo 'hello world';
};

つまり、それらを複数回使用することもできます。

3
bcosca

関数を使用する必要がある場合があります。したがって、クロージャーは、1つの場所でのみ使用される関数宣言をライブラリーに入力する必要がないため、コードをクリーンに保ちます。クロージャーはstyle=""およびCSSのクラスに似ています。確かに、あなたが持っているすべての1つのオフスタイルに対してクラスのボートロードを作成することができます。または、他の場所で使用せず、CSSファイルの肥大化を減らすため、それらを所定の場所に埋め込むことができます。

ただし、これは必須ではないため、関数を明示的に宣言する必要があると感じた場合は、自由に実行できます。

2
methodin

コールバックを作成する必要がある場合(具体的な例として、usortの比較関数としましょう)、通常は無名関数が適しています。特に、関数の定義がいくつかの入力に依存している場合(これは、クロージャーを意味します。これは、anon関数と同義ではありません)

function createCallback($key, $desc = false)
{
    return $desc ? 
       function($a, $b) use ($key) {return $b[$key] - $a[$key];} :
       function($a, $b) use ($key) {return $a[$key] - $b[$key];};
}


usort($myNestedArray, createCallback('age'));  //sort elements of $myNestedArray by key 'age' ascending
usort($myNestedArray, createCallback('age', true); //descending
2
jon_darkstar

私の意見では、無名関数は関数の callbacks として最もよく使用されます。多くのphp array functions はこれらをパラメーターとして使用します。

observer/event listener パターンでも使用できます。

1
gnarf

jQuery /Javascriptを使用すると、カスタムイベントコールバックを定義できます。 jQueryコアがどのように処理するかを見てみましょう [〜#〜] ajax [〜#〜]

イベントコールバックに匿名関数を使用するjQueryの例:

$.ajax({
  url: 'ajax/test.html',
  complete: function(data) {
    $('.result').html(data);
    alert('Load was performed.');
  }
});

カスタムコールバックを含むその他のイベントは、beforeSenderrorsuccessです。 オーサリングカスタムプラグイン の場合、この柔軟なイベントコールバックシステムを最大限に活用できます。

1
Derek Adair