46 votes

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?

Édité ; Je viens de trouver un truc sympa avec les fonctions anonymes php ...

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

91voto

Gumbo Points 279147

Les fonctions anonymes sont utiles lors de l'utilisation de fonctions qui nécessitent une fonction de rappel comme array_filter ou array_map faire:

$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 devez définir une fonction que vous utilisez seulement 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);

25voto

salathe Points 26305

Les fonctions anonymes sont disponibles à partir de PHP 5.3.

Les fonctions anonymes ont été disponibles en PHP pour une longue période de temps: create_function a été autour depuis la version 4.0.1. Cependant, vous avez tout à fait raison de dire qu'il est un nouveau concept et de la syntaxe disponible depuis PHP 5.3.

Dois-je les utiliser ou de les éviter? Si oui, comment?

Si vous avez déjà utilisé l' create_function avant, puis la nouvelle syntaxe pouvez simplement glisser à droite dans lequel vous avez utilisé que. Comme d'autres réponses ont mentionné, un cas courant est pour "jetable" des fonctions où ils sont pour être utilisé une seule fois (ou dans un endroit unique, au moins). Souvent qui vient sous la forme de rappels pour les goûts de array_map/réduire/filtre, la fonction preg_replace_callback, usort, etc..

Exemple d'utilisation d'une fonction anonyme pour compter le nombre de fois que les lettres apparaissent dans les mots (ce qui pourrait être fait dans un certain nombre d'autres moyens, 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 (ciselée par souci de concision):

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

10voto

animuson Points 23184

Peut-être pourriez-vous simplement lire l'article de PHP sur les fonctions anonymes . C'est en fait assez bon.

4voto

Kamil Points 260

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, les classes dans le conteneur di , mais des instances seront créées uniquement si vous en avez besoin.

2voto

naivists Points 15639

Une utilisation typique de fonctions anonymes est des fonctions de rappel. Par exemple, vous pourriez les utiliser pour rappel à partir d'algorithmes de tri comme dans la fonction uksort ( http://lv.php.net/uksort ) ou le remplacement d'algorithmes tels que preg_replace_callback ( http://lv.php.net/manual/en/function.preg-replace-callback.php). Ne l'ai pas essayé moi-même en PHP, donc c'est juste une supposition.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X