web-dev-qa-db-fra.com

Pourquoi et comment utilisez-vous des fonctions anonymes en PHP?

Les fonctions anonymes sont disponibles à partir de PHP 5.3.
Devrais-je les utiliser ou les éviter? Si c'est le cas, comment?

Edité ; Je viens de trouver un truc sympa avec des fonctions anonymes php ...

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

Les fonctions anonymes sont utiles lorsque vous utilisez des fonctions nécessitant une fonction de rappel like array_filter ou 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);

Sinon, vous devrez définir une fonction que vous n'utiliserez peut-être qu'une fois:

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

Les fonctions anonymes sont disponibles à partir de PHP 5.3.

Les fonctions anonymes sont disponibles dans PHP depuis longtemps: create_function existe depuis PHP 4.0.1. Cependant, vous avez tout à fait raison de dire qu'un nouveau concept et une nouvelle syntaxe sont disponibles à partir de PHP 5.3.

Devrais-je les utiliser ou les éviter? Si c'est le cas, comment?

Si vous avez déjà utilisé create_function auparavant, la nouvelle syntaxe peut simplement se glisser là où vous l'avez utilisée. Comme d'autres réponses l'ont mentionné, le cas le plus courant est celui des fonctions "à jeter", qui ne doivent être utilisées qu'une seule fois (ou au moins à un seul endroit). Généralement, cela se présente sous la forme de callbacks pour des personnes comme array_map / reduction / filter , preg_replace_callback , usort , etc .. 

Exemple d'utilisation de fonctions anonymes pour compter le nombre de fois que des lettres apparaissent dans des mots (ceci peut être fait de plusieurs autres manières, c'est juste un exemple):

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

Ce qui donne (coupé pour la brièveté):

Array
(
    [a] => 5
    [n] => 3
    [e] => 2
    ... more ...
    [y] => 1
)
23
salathe

Vous pourriez peut-être simplement lire l'article de PHP sur Fonctions anonymes . C'est en fait assez bon.

9
animuson

Les fonctions anonymes peuvent aussi être très utiles pour créer des fonctions dans le conteneur DI, par exemple "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());

Exemple avec paramètres d'utilisation et variables suivantes

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

Donc, ici vous pouvez voir comment vous pouvez utiliser des fonctions anonymes pour économiser de la mémoire et la charge du serveur. Vous pouvez avoir défini tous les plugins importants, classes dans le conteneur di, mais des instances seront créées uniquement si vous en avez besoin.

4
Kamil

Les fonctions de rappel sont une utilisation typique des fonctions anonymes. Par exemple, vous pouvez les utiliser pour rappeler des algorithmes de tri tels que dans la fonction uksort ( http://lv.php.net/uksort ) ou remplacer des algorithmes tels que preg_replace_callback ( http: //lv.php .net/manual/fr/function.preg-replace-callback.php ) . Je n'ai pas essayé moi-même en PHP, c'est donc une supposition.

2
naivists

Voici un exemple d'utilisation de fonctions anonymes dans 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));

Dans l'exemple ci-dessus, nous avons écrit des fonctions anonymes qui vérifient si une clé existe dans le tableau saisi. S'il existe, il le mettra dans le tableau de sortie. 

0
devquora