Interprétation détaillée des fonctions de rappel PHP et des fonctions anonymes

墨辰丷
Libérer: 2023-03-26 16:04:01
original
1291 Les gens l'ont consulté

Cet article présente principalement les fonctions de rappel PHP et les fonctions anonymes, et analyse les fonctions spécifiques, l'utilisation et les précautions associées des fonctions de rappel PHP et des fonctions anonymes sous forme d'exemples. Les amis dans le besoin peuvent se référer à

pour. détails Comme suit :

Les fonctions de rappel et les fonctions anonymes

Les fonctions de rappel et les fermetures ne sont pas inconnues dans JS. JS peut les utiliser pour compléter le. mécanisme d'événement, effectue de nombreuses opérations complexes. Il n'est pas couramment utilisé en PHP. Aujourd'hui, parlons des fonctions de rappel et des fonctions anonymes en PHP.

Fonction de rappel

Fonction de rappel : rappel (c'est-à-dire que le rappel puis le retour reviendront à la fonction principale après avoir été appelé par la fonction principale ), qui fait référence aux paramètres de fonction transmis à un autre code, une référence à un certain 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 Le concept de (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 caractère Les paramètres de chaîne sont transmis. Remarque : S'il s'agit d'une fonction statique, elle doit être 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}

④ Utilisez directement la fonction anonyme et définissez la fonction directement sur le paramètre , n'attribue pas de valeurs de variables spécifiques ;

La première méthode n'est plus mentionnée car elle est couramment utilisée ; la deuxième méthode, similaire à la méthode eval(), est également officiellement répertoriée comme non recommandée par PHP ; méthode, et la façon dont elle est définie est si peu intuitive que je ne l'ai pas utilisée ailleurs que pour des tests, donc 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 ? En utilisant le mot-clé use(), il est très pratique d'introduire 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 à ce qui suit code :

$result = [];
foreach($vars as $key=>$val){
  $item = callback();
  $result[] = $item;
}
return $result;
array_walk($vars, $callback)
Copier après la connexion

Le rappel doit être le suivant :

$callback = function(&$val, $key[, $arg]){  
  doSomething($val);
}
Copier après la connexion

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 le array_map() mentionné 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;     
}
Copier après la connexion

array_filter filtrera les éléments qui renvoient false lorsque $callback est exécuté, et 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. ..]);

son $callback est similaire à :

$callback = function($var_a[, $var_b...]){
  doSomething($var_a, $var_b);
}
Copier après la connexion

返回$var_as经过callback处理后的数组(会改变原数组);如果有多个数组的时候将两个数组同样顺序的项目传入处理,执行次数为参数数组中项目最多的个数;

usort/array_reduce

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

usort(&$vars, $callback)

$callback应该如下:

callback = function($left, $right){
    $res = compare($left, $right);
    return $res;
}
Copier après la connexion

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;
}
Copier après la connexion

初始值$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;
}
Copier après la connexion

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

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

总结

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

usort($records, function mySortFunc($arg) use ($order){
  func_statement;
});
Copier après la connexion

相关推荐:

PHP回调函数与匿名函数使用案例解析

结合代码详细为你讲解,php中的array_map,array_walk以及匿名函数

php中的匿名函数和闭包(closure)用法

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal