Maison  >  Article  >  développement back-end  >  Analyse de la fonction de rappel PHP

Analyse de la fonction de rappel PHP

*文
*文original
2017-12-22 10:41:272721parcourir

Les personnes familiarisées avec le développement de nœuds doivent être familiarisées avec les fonctions de rappel, mais elles ne sont pas couramment utilisées en PHP. En fait, PHP prend également en charge les fonctions de rappel. Aujourd'hui, nous allons expliquer en détail l'utilisation des fonctions de rappel et des fonctions anonymes en PHP.

Fonction de rappel

Fonction de rappel : rappel (c'est-à-dire rappeler puis revenir
reviendra à la fonction principale après avoir été appelé et exploité par la fonction principale), qui fait référence à une fonction qui est transmis à d’autres codes via les paramètres de fonction. Une référence à un bloc de code exécutable.

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.

Fonction anonyme :

La fonction anonyme, comme son nom l'indique, est une fonction 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 anonymes). dans la fonction de fermeture 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}; Direct Utiliser des fonctions anonymes pour définir des fonctions directement sur les paramètres 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 est similaire à l'utilisation de la méthode eval(), Elle est également officiellement répertoriée comme méthode obsolète par PHP, et sa méthode de définition est trop peu intuitive. Je ne l'ai pas utilisée ailleurs, sauf pour des tests, et je ne la mentionnerai 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 :

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

Le rappel doit être le suivant :
$result = [];
foreach($vars as $key=>$val){
        $item = callback();
        $result[] = $item;
}
return $result;
array_walk($vars, $callback)

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.
$callback = function(&$val, $key[, $arg]){    
   doSomething($val);
}

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, 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 à :

array_filter filtrera $callback et retournera false lorsque éléments exécutés, array_filter renvoie le tableau une fois le filtrage terminé.
$callback = function($var){
   return true or false;         
}

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 à :

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
$callback = function($var_a[, $var_b...]){
     doSomething($var_a, $var_b);
}

usort/array_reduce

Mettez ces deux fonctions ensemble, car leurs mécanismes d'exécution sont quelque peu particuliers.

usort(&$vars, $callback)

$callback devrait être le suivant :

usort renvoie si l'exécution est réussie ou non, une valeur booléenne . La méthode définie par l'utilisateur compare $left et $right, où $left et $right sont deux éléments quelconques dans $vars ;

callback = function($left, $right){
    $res = compare($left, $right);
    return $res;
}
$left > Renvoie un entier négatif, renvoie 0 lorsque $left = $right

;

$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。

可用此函数实现PHP的事件机制,其实并不高深,在判断条件达成,或程序执行到某一步后 call_user_func()就OK了。这个我在之前的博客中也有介绍到:搭建自己的PHP框架心得(二)


总结

其实以上$callback不用单独定义并使用变量引用,使用上面说过的第四种函数定义方式,直接在函数内定义,使用‘完全’匿名函数就行了。 如:

usort($records, function mySortFunc($arg) use ($order){
      func_statement;
});

是不是逼格满满呢?

相关阅读:

php的闭包(Closure)匿名函数初探

详解PHP匿名函数与注意事项

PHP匿名函数和use子句用法实例,匿名use子句实例_PHP教程

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