45

無名関数は PHP 5.3 から利用できます。
それらを使うべきですか、それとも避けるべきですか?もしそうなら、どのように?

編集; php匿名関数を使った素敵なトリックを見つけました...

$container           = new DependencyInjectionContainer();
$container->mail     = function($container) {};
$conteiner->db       = function($container) {};
$container->memcache = function($container) {};
4

6 に答える 6

91

匿名関数は、次のようなコールバック関数を必要とする関数を使用する場合に役立ちます。array_filterarray_map

$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回だけ使用する関数を定義する必要があります。

function isEven($val) { return $val % 2 == 0; }
$arr_even = array_filter($arr, 'isEven');
function square($val) { return $val * $val; }
$arr_square = array_map('square', $arr);
于 2010-03-09T20:36:00.450 に答える
24

無名関数は PHP 5.3 から利用できます。

匿名関数は PHP で長い間利用可能でした: create_functionは PHP 4.0.1 から使用されています。しかし、PHP 5.3 の時点で新しい概念と構文が利用可能になったというあなたの意見は正しいです。

それらを使うべきですか、それとも避けるべきですか?もしそうなら、どのように?

以前に使用したことがある場合create_function、新しい構文は、それを使用した場所に簡単に滑り込むことができます。他の回答が述べたように、一般的なケースは、一度だけ (または少なくとも 1 つの場所で) 使用される「使い捨て」関数の場合です。通常、これはarray_map / reduce / filterpreg_replace_callbackusortなどのコールバックの形式で提供されます。

匿名関数を使用して文字が単語に出現する回数をカウントする例 (これは他の多くの方法で実行できますが、これは単なる例です):

$array = array('apple', 'banana', 'cherry', 'damson');

// For each item in the array, count the letters in the word
$array = array_map(function($value){
    $letters = str_split($value);
    $counts  = array_count_values($letters);
    return $counts;
}, $array);

// Sum the counts for each letter
$array = array_reduce($array, function($reduced, $value) {
    foreach ($value as $letter => $count) {
        if ( ! isset($reduced[$letter])) {
            $reduced[$letter] = 0;
        }
        $reduced[$letter] += $count;
    }
    return $reduced;
});

// Sort counts in descending order, no anonymous function here :-)
arsort($array);

print_r($array);

これは(簡潔にするために切り取られています):

Array
(
    [a] => 5
    [n] => 3
    [e] => 2
    ... more ...
    [y] => 1
)
于 2010-03-09T21:20:35.300 に答える
10

Anonymous Functionsに関する PHP の記事を読んでいただければ幸いです。それは実際にはかなり良いです。

于 2010-03-09T20:33:50.063 に答える
2

無名関数の典型的な用途は、コールバック関数です。たとえば、関数uksort( http://lv.php.net/uksortpreg_replace_callback ) などの並べ替えアルゴリズムからのコールバックや、 ( http://lv.php.net/manual/en/functionなどのアルゴリズムの置換)に使用できます。 .preg-replace-callback.php )。PHPで自分で試したことがないので、これは単なる推測です。

于 2010-03-09T20:30:18.923 に答える