可能性のある複製:
PHPで匿名関数をどのように使用しますか?
なぜ無名関数を使用する必要があるのですか?つまり、それを使用する本当の取引は何ですか?私は本当にこれを手に入れません。つまり、関数を使用してコードをよりクリーンにするか、複数回使用します。しかし、無名関数は、前者も後者も行いません。私はそれらをグーグルで調べました、そして、同じ問題を尋ねている人を見つけることができませんでした。
匿名関数は、それらを使用する優れたライブラリクラス/関数がある場合に、その美しさを示すと言えます。彼ら自身はそれほどセクシーではありません。 .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; }
)
偶数の積を計算します。
いくつかの哲学。機能とは何ですか?呼び出すことができる機能の単位とコードの再利用の単位。場合によっては、最初の部分だけを必要とすることがあります。それは、アクションを呼び出して実行する機能ですが、まったく再利用したくなく、コードの他の部分から見えるようにしたくもありません。これが、無名関数が本質的に行うことです。
特にコールバックに役立ちます:
array_walk($myArray, function($value, $key) {
// do something
});
通常、一度だけ必要な関数には無名関数を使用します。この方法では、関数の名前空間を汚染せず、array_walk_callback1
のような奇妙な関数名を作成しません。
おそらく最も明白な理由は、コールバックの使用です。 usort()
関数を例にとります。 1回だけ使用される1行の関数を導入しても意味がありません。匿名関数(通常)はこのタスクに適しています。
匿名関数を変数に保存して渡すことができます。
$a=function() {
echo 'hello world';
};
つまり、それらを複数回使用することもできます。
関数を使用する必要がある場合があります。したがって、クロージャーは、1つの場所でのみ使用される関数宣言をライブラリーに入力する必要がないため、コードをクリーンに保ちます。クロージャーはstyle=""
およびCSSのクラスに似ています。確かに、あなたが持っているすべての1つのオフスタイルに対してクラスのボートロードを作成することができます。または、他の場所で使用せず、CSSファイルの肥大化を減らすため、それらを所定の場所に埋め込むことができます。
ただし、これは必須ではないため、関数を明示的に宣言する必要があると感じた場合は、自由に実行できます。
コールバックを作成する必要がある場合(具体的な例として、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
私の意見では、無名関数は関数の callbacks として最もよく使用されます。多くのphp array functions はこれらをパラメーターとして使用します。
observer/event listener パターンでも使用できます。
jQuery /Javascriptを使用すると、カスタムイベントコールバックを定義できます。 jQueryコアがどのように処理するかを見てみましょう [〜#〜] ajax [〜#〜] 。
$.ajax({
url: 'ajax/test.html',
complete: function(data) {
$('.result').html(data);
alert('Load was performed.');
}
});
カスタムコールバックを含むその他のイベントは、beforeSend
、error
、success
です。 オーサリングカスタムプラグイン の場合、この柔軟なイベントコールバックシステムを最大限に活用できます。