Maison  >  Article  >  développement back-end  >  Explication détaillée de l'utilisation des fonctions de rappel php et des fonctions anonymes

Explication détaillée de l'utilisation des fonctions de rappel php et des fonctions anonymes

伊谢尔伦
伊谢尔伦original
2017-06-26 14:29:111726parcourir

Fonction de rappel et Fonction anonyme

La fonction de rappel et la fermeture ne sont pas étrangères à JS et peuvent les utiliser pour compléter le mécanisme d'événements et effectuer de nombreuses tâches complexes. .opérer. Il n'est pas couramment utilisé en PHP. Aujourd'hui, parlons des fonctions de rappel et des fonctions anonymes en PHP.

Fonction de rappel Le rappel (c'est-à-dire que le rappel reviendra à la fonction principale après avoir été appelé par la fonction principale) fait référence à une référence à un certain bloc de code exécutable qui est transmis à d'autres codes via les paramètres de la fonction. .

L'explication populaire est de passer la fonction en tant que paramètre dans une autre fonction pour l'utiliser ; il existe de nombreuses fonctions en PHP qui "nécessitent des paramètres en tant que fonctions", telles que array_map, usort, call_user_func_array, etc., qu'elles exécutent. la fonction transmise, puis renvoie le résultat directement à la fonction principale. L'avantage est que les fonctions sont pratiques à utiliser comme valeurs et que le code est concis et lisible.

Les fonctions anonymes, comme leur nom l'indique, sont des fonctions sans nom de fonction déterminé. PHP traite les fonctions anonymes et les fermetures comme le même concept (les fonctions anonymes sont également appelées fonctions de fermeture en PHP). Son utilisation, bien entendu, ne peut être utilisée que comme variable.

Il existe quatre façons d'attribuer une fonction à une variable en PHP :

Ce que nous utilisons souvent : la fonction est définie en externe/ou intégrée en PHP, et le nom de la fonction est directement utilisé comme chaîne Les paramètres sont transmis. Remarque : S'il s'agit d'une fonction statique de classe, elle est transmise sous la forme CLASS::FUNC_NAME.

Utilisez create_function($args, $func_code); pour créer une fonction, qui renverra un nom de fonction. $func_code est le corps du code, $args est la chaîne de paramètres, séparée par ',' ;

affectation directe : $func_name = function($arg){statement} ;

utilise directement anonyme. function , définit la fonction directement au niveau du paramètre, sans attribuer de valeurs de variable spécifiques ;

La première méthode est couramment utilisée et ne sera pas mentionnée davantage. La deuxième méthode, similaire à la méthode eval(), est également utilisée ; par PHP La méthode officielle n'est pas recommandée, et sa définition est trop peu intuitive. Je ne l'ai pas utilisée ailleurs sauf pour des tests, et je n'en parlerai pas. Ici, nous nous concentrons sur les troisième et quatrième utilisations ;

Les fonctions créées par ces deux dernières sont appelées fonctions anonymes, c'est-à-dire que les fonctions créées par la troisième méthode d'affectation sont très flexibles et peuvent être référencées. à travers des variables. Vous pouvez utiliser is_callable($func_name) pour tester si cette fonction peut être appelée, ou vous pouvez l'appeler directement via $func_name($var) ; la fonction créée de la quatrième manière est plus similaire à la fonction de rappel dans JS et ne le fait pas. require variable assignation. , utilisé directement ;

Une autre introduction spéciale est le mot-clé use, qui peut être utilisé pour référencer des variables dans la portée parent lors de la définition d'une fonction ; ) { déclaration_fonction} . Parmi eux, $outside_arg est une variable dans la portée parent et peut être utilisée dans function_statement.

Cet usage est utilisé dans la fonction de rappel "le nombre de valeurs de paramètres est déterminé". Par exemple, usort nécessite que la valeur du paramètre $callback soit composée de deux éléments, mais que se passe-t-il si nous devons introduire d'autres paramètres pour affecter le tri ? L'utilisation du mot-clé use() facilite l'introduction d'une nouvelle variable dans $callback pour un usage interne.

array_map/array_filter/array_walk:

Mettez ces trois fonctions ensemble car la logique d'exécution de ces trois fonctions est similaire, similaire au code suivant :

$result = [];
foreach($vars as $key=>$val){
    $item = callback();
    $result[] = $item;
}
return $result;

Le rappel doit être le suivant :

$callback = function(&$val, $key[, $arg]){    
            doSomething($val);
        }

array_walk renvoie si l'exécution a réussi, ce qui est une valeur booléenne. L'ajout d'un symbole de référence à $value peut modifier la valeur $value dans la fonction pour obtenir l'effet de modification du tableau $vars. Étant donné que son $callback nécessite deux paramètres, array_walk ne peut pas transmettre des $callbacks tels que strtolower/array_filter. Si vous souhaitez obtenir des fonctions similaires, vous pouvez utiliser array_map() pour en discuter ensuite.

array_walk_recursive($arr, $callback);

La valeur de retour et le mécanisme d'exécution sont similaires à array_walk;

Le rappel est le même que array_walk, mais la différence est que si $val est un tableau, la fonction traitera récursivement $val vers le bas ; il convient de noter que dans ce cas, $val est la clé $ du tableau et sera ignorée.

array_filter($vars, $callback, $flag);

son $callback est similaire à :

$callback = function($var){
              return true or false;         
            }

array_filter filtrera $callback et retournera false lorsque éléments exécutés, array_filter renvoie le tableau une fois le filtrage terminé.

Le troisième paramètre $flag détermine la valeur de son paramètre de rappel $var, mais cela peut être une fonctionnalité des versions supérieures de PHP. Mon PHP5.5.3 ne le supporte pas. Vous pouvez le tester vous-même. Par défaut, la valeur de chaque élément du tableau est transmise. Lorsque l'indicateur est ARRAY_FILTER_USE_KEY, la clé de chaque élément du tableau est transmise et ARRAY_FILTER_USE_BOTH est transmise dans la clé et la valeur

array_map ; ($callback, &$var_as [,$var_bs...] );

Le $callback est similaire à :

$callback = function($var_a[, $var_b...]){
            doSomething($var_a, $var_b);
        }

Renvoyer le tableau $var_as après le traitement du rappel (modifiera le tableau d'origine); s'il y a plusieurs tableaux, deux éléments du tableau dans le même ordre sont transmis pour le traitement, et le nombre d'exécutions est le nombre maximum d'éléments dans le tableau de paramètres

;

usort/array_reduce

把这两个函数放在一块,因为他们的执行机制都有些特殊。

usort(&$vars, $callback)

$callback应该如下:

  callback = function($left, $right){
        $res = compare($left, $right);
        return $res;
    }

usort返回执行成功与否,bool值。用户自定义方法 比较$left 和 $right,其中$left和$right是$vars中的任意两项;

$left > $right时返回 正整数, $left < $right时返回 负整数, $left = $right时返回0;

$vars中的元素会被取出会被由小到大升序排序。 想实现降序排列,将$callback的返回值反一下就行了。

array_reduce($vars ,$callable [, mixed $initial = NULL])

$callback应该如下:

  $callback = function($initial, $var){
        $initial = calculate($initail, $var);
        return $initial;
    }

初始值$initial默认为null,返回经过迭代后的initial;一定要将$initial返回,这样才能不停地改变$initial的值,实现迭代的效果。

这里顺便说一下map和reduce的不同:

map:将数组中的成员遍历处理,每次返回处理后的一个值,最后结果值为所有处理后值组成的多项数组;

reduce:遍历数组成员,每次使用数组成员结合初始值处理,并将初始值返回,即使用上一次执行的结果,配合下一次的输入继续产生结果,结果值为一项;

call_user_func/call_user_func_array

call_user_func[_array]($callback, $param)

$callback形如:

  $callback = function($param){
        $result = statement(); 
        return $result;
    }

返回值多种,具体看$callback。

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn