web-dev-qa-db-ja.com

PHPで匿名関数を使用する理由と方法

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

編集済み; PHPの匿名関数で素敵なトリックを見つけました...

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

匿名関数 は、 コールバック関数 を必要とする関数を使用する場合に便利です array_filter または array_map do:

$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);

そうでなければ、おそらく一度しか使用しない関数を定義する必要があります:

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);
89
Gumbo

無名関数はPHP 5.3。

無名関数はPHPで長い間利用可能です: create_function はPHP 4.0.1。 PHP 5.3。

それらを使用する必要がありますか?もしそうなら、どのように?

以前にcreate_functionを使用したことがある場合、新しい構文は、それを使用した場所にそのまま移動できます。他の答えが述べたように、一般的なケースは、「使い捨て」機能で、一度だけ(または少なくとも1か所で)使用される場合です。一般的には、 array_map / reduce / filterpreg_replace_callback 、-のようなコールバックの形式で提供されます sort など。

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

$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
)
24
salathe

匿名関数 に関するPHPの記事を読むことができるかもしれません。実際にはかなり良いです。

9
animuson

匿名関数は、DIコンテナーへの関数の作成にも非常に役立ちます。たとえば、「bootstrap.php」:

//add sessions
$di->add("session",function(){ return new Session(); });
//add cache
$di->add("cache",function(){ return new Cache(); });
//add class which will be used in any request
$di->add("anyTimeCalledClass", new SomeClass());

使用パラメーターと次の変数の例

$di->add("myName",function($params) use($application){
      $application->myMethod($params);
});

したがって、ここでは、匿名関数を使用してメモリとサーバーの負荷を節約する方法を確認できます。 diコンテナ内のすべての重要なプラグイン、クラスを定義できますが、インスタンスは必要に応じて作成されます。

4
Kamil

匿名関数の典型的な使用法はコールバック関数です。たとえば、関数uksorthttp://lv.php.net/uksort )などのソートアルゴリズムからのコールバック、またはpreg_replace_callbackなどの置換アルゴリズム(- http://lv.php.net/manual/en/function.preg-replace-callback.php )。 PHPで自分で試していないので、これは単なる推測です。

2
naivists

Phpで匿名関数を使用する使用例は次のとおりです。

$suppliers=['add1'=>'nodia','add2'=>'delhi', 'add3'=>'UP'];
 $getAddress = function($suppliers){ $address=[];
 for($i=1;$i<5;$i++){
  if(array_key_exists('add'.$i, $suppliers))
    $address[]=$suppliers['add'.$i];
  }
 return $address;};
 print_r($getAddress($suppliers));

上記の例では、入力された配列にキーが存在するかどうかをチェックする匿名関数を作成しました。存在する場合、それを出力配列に入れます。

0
devquora