compréhension approfondie des fonctions d'ordre supérieur en PHP: améliorer la flexibilité du code et la réutilisabilité
Les fonctions avancées sont largement utilisées dans de nombreuses grandes applications et cadres. JavaScript, Java, .NET, Python et même PHP prennent tous en charge le concept de fonctions d'ordre supérieur. Mais quelles sont les fonctions d'ordre supérieur? Pourquoi l'utilisons-nous? Quels sont ses avantages? Comment simplifier le code avec? Cet article se concentrera sur les fonctions d'ordre supérieur en PHP et les comparera avec d'autres langues.
callable
peut être utilisé pour identifier les fonctions d'ordre supérieur. Si une fonction ou une méthode a un paramètre callable
, cela signifie qu'il accepte une fonction en entrée. array_map
et array_filter
. Ces fonctions prennent une fonction de rappel comme un argument et l'appliquent aux éléments du tableau de différentes manières. calc()
prend plusieurs fonctions d'entrée et fonctionne sur plusieurs paramètres. Avant de comprendre les fonctions d'ordre supérieur, vous devez d'abord comprendre les caractéristiques du langage qui prennent en charge les fonctions de première classe (également appelées fonctions de premier ordre). Cela signifie que la langue traite la fonction comme un citoyen de première classe. En d'autres termes, le langage gère fonctionne de la même manière que les variables. Vous pouvez stocker des fonctions dans des variables, les transmettre sous forme de variables à d'autres fonctions, les renvoyer de fonctions comme les variables et même les stocker dans des tableaux ou des propriétés d'objet comme vous le feriez avec des variables. Aujourd'hui, la plupart des langues modernes ont cette fonctionnalité par défaut. Il vous suffit de savoir que les fonctions peuvent être transmises et utilisées comme des variables.
Cet article se concentrera principalement sur les fonctions de passage comme paramètres et les fonctions de retour comme résultats, et introduira brièvement les concepts de variables et de fermetures non locales. (Vous pouvez en savoir plus sur ces concepts dans les sections 1.1, 1.4 et 1.3 des articles Wikipedia liés au paragraphe précédent.)
Les fonctions d'ordre avancé ont deux caractéristiques principales. Les fonctions avancées peuvent implémenter une ou deux des caractéristiques suivantes: acceptez une ou plusieurs fonctions en entrée ou renvoyez une fonction en sortie. Dans PHP, il existe un mot-clé qui montre clairement qu'une fonction est une fonction d'ordre supérieur: le mot-clé callable
. Bien que ce mot-clé n'existe pas nécessairement, il facilite la reconnaissance des fonctions d'ordre supérieur. Si vous voyez une fonction ou une méthode avec le paramètre callable
, cela signifie qu'il accepte une fonction en entrée. Un autre indicateur simple est si vous voyez une fonction utilisant son instruction return
pour renvoyer une fonction. L'instruction return
peut être juste le nom de la fonction, ou il peut s'agir d'une fonction anonyme / en ligne. Voici quelques exemples de chaque type.
// 我们将传递给高阶函数的简单用户定义函数 function echoHelloWorld() { echo "Hello World!"; } // 接受函数作为输入并调用它的高阶函数 function higherOrderFunction(callable $func) { $func(); } // 调用我们的高阶函数并传入我们的echoHelloWorld()函数。 // 请注意,我们只将名称作为字符串传递,没有括号。 // 这将输出 "Hello World!" higherOrderFunction('echoHelloWorld');
Voici quelques exemples simples de fonctions d'ordre supérieur qui renvoient les fonctions:
// 返回PHP中名为trim()的现有函数。注意它是一个简单的字符串,没有括号。 function trimMessage1() { return 'trim'; } // 这是一个使用匿名内联函数的示例 function trimMessage2() { return function($text) { return trim($text); }; } // 返回'trim'函数 $trim1 = trimMessage1(); // 使用我们的字符串进行修剪并调用它 echo $trim1(' hello world '); // 返回内部调用'trim'的匿名函数 $trim2 = trimMessage1(); // 使用我们的字符串进行修剪并再次调用它 echo $trim2(' hello world ');
Vous pouvez imaginer que vous pouvez passer dans une fonction et l'utiliser pour générer une autre fonction renvoyée. Très très intelligent, non? Mais pourquoi faites-vous cela? Cela ressemble à quelque chose qui rendra les choses plus compliquées.
Il existe de nombreuses raisons pour lesquelles vous devrez peut-être créer des fonctions d'ordre supérieur dans votre code. À partir de la flexibilité du code, de la réutilisation du code, de l'extension de code aux solutions de code qui imitent le code que vous voyez dans d'autres programmes, il y a beaucoup de choses. Bien qu'il y ait de nombreuses raisons, nous en présenterons plusieurs ici.
Les fonctions d'ordre élevé ajoutent beaucoup de flexibilité. Sur la base de l'exemple précédent, vous avez peut-être vu certaines utilisations. Vous pouvez écrire une seule fonction qui prend un ensemble entier de différentes fonctions et les utilise sans avoir à écrire de code pour les exécuter individuellement.
peut-être que la fonction d'ordre supérieur elle-même ne sait pas quel type de fonction il recevra. Qui a dit qu'une fonction doit connaître des informations sur la fonction qu'elle reçoit? La fonction d'entrée peut être une fonction add()
pendant un certain temps, et le moment suivant peut être une fonction divide()
. Dans les deux cas, cela fonctionne bien.
Cette fonction facilite également l'ajout d'autres fonctions d'entrée plus tard. Supposons que vous ayez add()
et divide()
, mais vous devez ajouter des fonctions sum()
plus tard. Vous pouvez écrire des fonctions sum()
et les passer par des fonctions d'ordre supérieur sans les changer. Dans les exemples ultérieurs, nous montrerons comment utiliser cette fonction pour créer notre propre fonction calc()
.
Une autre raison pour laquelle vous voudrez peut-être utiliser des fonctions d'ordre supérieur en PHP est de simuler le comportement des décorateurs dans Python. Vous «vous rassurez» une fonction dans une autre pour modifier le comportement de cette fonction. Par exemple, vous pouvez écrire une fonction sur le temps d'autres fonctions. Vous pouvez écrire une fonction d'ordre supérieur qui prend une fonction, démarre une minuterie, l'appelle, puis termine la minuterie pour voir combien de temps s'est écoulé.
La recherche de recherche de fonctions d'ordre supérieur en PHP est très simple. Vérifiez la documentation PHP et trouvez une fonction / méthode qui accepte les paramètres d'entrée callable
et vous en avez trouvé un. Voici quelques exemples de fonctions d'ordre supérieur couramment utilisées. Vous les avez peut-être même utilisés à votre insu.
array_map
et array_filter
// 我们将传递给高阶函数的简单用户定义函数 function echoHelloWorld() { echo "Hello World!"; } // 接受函数作为输入并调用它的高阶函数 function higherOrderFunction(callable $func) { $func(); } // 调用我们的高阶函数并传入我们的echoHelloWorld()函数。 // 请注意,我们只将名称作为字符串传递,没有括号。 // 这将输出 "Hello World!" higherOrderFunction('echoHelloWorld');
Voyons comment utiliser une autre fonction, cette fois en utilisant la fonction filtrante que nous avons définie séparément:
// 返回PHP中名为trim()的现有函数。注意它是一个简单的字符串,没有括号。 function trimMessage1() { return 'trim'; } // 这是一个使用匿名内联函数的示例 function trimMessage2() { return function($text) { return trim($text); }; } // 返回'trim'函数 $trim1 = trimMessage1(); // 使用我们的字符串进行修剪并调用它 echo $trim1(' hello world '); // 返回内部调用'trim'的匿名函数 $trim2 = trimMessage1(); // 使用我们的字符串进行修剪并再次调用它 echo $trim2(' hello world ');
array_filter
et array_map
sont deux fonctions d'ordre supérieur très populaires que vous trouverez dans de nombreux projets de code. Une autre fonction que vous pourriez utiliser est call_user_func
, qui prend une fonction et une liste de paramètres et appelle cette fonction. Il s'agit essentiellement d'une fonction d'ordre supérieur personnalisé. Son objectif est d'appeler d'autres fonctions définies par l'utilisateur:
$arrayOfNums = [1,2,3,4,5]; // array_map:使用内联匿名函数的示例 $doubledNums = array_map(function($num) { return $num * 2; }, $arrayOfNums); var_dump($doubledNums); // 输出包含 [2, 4, 6, 8, 10] 的数组
Nous avons montré de nombreux exemples de la façon dont les fonctions d'ordre supérieur fonctionnent dans PHP, et nous avons créé des fonctions personnalisées pour démontrer leurs diverses utilisations. Mais démontrons en outre sa flexibilité avec une nouvelle fonction appelée calc()
. Cette fonction recevra deux paramètres et une fonction qui fonctionnera sur ces deux paramètres pour nous donner un résultat:
$arrayOfNums = [1,2,3,4,5]; // 创建函数并将其提供给高阶函数array_filter()的示例 function isEven($num) { return ($num % 2) === 0; } // array_filter是一个高阶函数 $evenNums = array_filter($arrayOfNums, 'isEven'); var_dump($evenNums); // 输出包含 [2, 4] 的数组
Notez que nos fonctions calc()
sont écrites de manière très générale, vous permettant de recevoir un ensemble d'autres fonctions et de les appeler avec les paramètres $n1
et $n2
. Dans ce cas, notre fonction calculée ne se soucie pas de la fonction qu'il reçoit. Il passe simplement l'argument à la fonction et renvoie le résultat.
Mais attendez: notre patron nous a juste demandé d'ajouter une fonction au système existant pour ajouter deux chaînes ensemble. Mais la concaténation des chaînes n'est pas votre opération mathématique typique. Cependant, avec nos paramètres ici, nous avons juste besoin d'ajouter la concaténation des chaînes et de la passer par calc()
:
function printCustomMessage($message) { echo "$message"; } call_user_func('printCustomMessage', '通过使用call_user_func调用自定义消息!');
Bien que cet exemple soit farfelu, il montre comment vous pouvez utiliser ce concept dans un grand projet. Peut-être que les fonctions d'ordre supérieur déterminent comment les événements sont traités. Peut-être que, selon l'événement déclenché, vous pouvez le acheminer à travers la fonction de gestionnaire que vous avez transmis. Les possibilités sont infinies.
Prenons un décorateur simple dans Python comme exemple et comparez-le avec JavaScript, puis comparez-le avec PHP. De cette façon, si vous connaissez Python ou JS, vous pouvez voir qu'il est équivalent.
function add($a, $b) { return $a + $b; } function subtract($a, $b) { return $a - $b; } function multiply($a, $b) { return $a * $b; } // 传递$n1和$n2的高阶函数 function calc($n1, $n2, $math_func) { return $math_func($n1, $n2); } $addedNums = calc(1, 5, 'add'); $subtractedNums = calc(1, 5, 'subtract'); $multipliedNums = calc(1, 5, 'multiply'); // 输出 6 echo "相加的数字:$addedNums\n"; // 输出 -4 echo "相减的数字:$subtractedNums\n"; // 输出 5 echo "相乘的数字:$multipliedNums\n";
Voyons maintenant comment implémenter cela dans des fonctions d'ordre supérieur JavaScript:
function addTwoStrings($a, $b) { return $a . " " . $b; } // 输出 "Hello World!" $concatenatedStrings = calc('Hello', 'World!', 'addTwoStrings');
Enfin, comparons-le à php:
def say_message(func): def wrapper(): print('调用函数之前打印') func() print('调用函数之后打印') return wrapper def say_hello_world(): print("Hello World!") # 将我们的hello world函数传递给say_message函数。 # 它返回一个函数,然后我们可以调用它 # 注意:这一行可以用say_hello_world方法上的@say_message(派语法)代替 say_hello_world = say_message(say_hello_world) # 调用创建的函数 say_hello_world() # 输出... # 调用函数之前打印 # Hello World! # 调用函数之后打印
De la comparaison côte à côte, nous pouvons voir que la version PHP est très similaire à la syntaxe JavaScript. Cependant, si vous en savez un peu sur Python et Decorator, vous pouvez voir comment convertir un décorateur en deux autres langages de programmation.
Lorsque vous utilisez des fonctions d'ordre supérieur, vous voyez souvent l'utilisation de fonctions anonymes en ligne (également appelées lambdas). Dans l'exemple que nous avons vu ci-dessus, j'ai utilisé ce format. En dehors de cela, j'ai également utilisé une version plus explicite de la définition d'abord de la fonction, puis de la passer à une fonction d'ordre supérieur. Il s'agit de s'habituer à voir les deux versions. La plupart du temps, vous verrez des versions Lambda en ligne dans des cadres qui utilisent des fonctions d'ordre élevé. Ne laissez pas ce format vous effrayer. Ils créent simplement une fonction simple sans nom et l'utilisent pour où vous fournissez le nom de fonction indépendante.
Dans cet article, nous introduisons la définition de base de faire une fonction une fonction d'ordre supérieur. Toute fonction qui accepte ou renvoie une fonction (ou les deux) peut être considérée comme une fonction d'ordre supérieur. Nous discutons également de la raison pour laquelle vous voudrez peut-être créer ces types de fonctions et leurs avantages.
Ensuite, nous montrons quelques exemples de fonctions d'ordre supérieur existantes dans PHP, telles que array_map
et array_filter
, puis procéder à la création de notre propre fonction d'ordre supérieur appelé calc()
, qui accepte plusieurs fonctions d'entrées et Opérez sur plusieurs paramètres. Nous avons ensuite fait une comparaison côte à côte pour montrer comment la solution de PHP se compare aux implémentations Python Decorator et JavaScript. J'espère que vous pourrez en savoir plus sur les fonctions d'ordre supérieur et pourquoi vous devrez peut-être les considérer dans votre prochaine grande solution. Ils peuvent offrir de nombreux avantages et réduire le code de passe-partout qui peut être redondant.
Si vous souhaitez en savoir plus sur la programmation fonctionnelle dans PHP, vous pouvez vous référer à notre tutoriel.
Merci d'avoir lu!
Les fonctions d'ordre élevé en PHP sont un concept de base de la programmation fonctionnelle. Ce sont des fonctions qui peuvent fonctionner sur d'autres fonctions en les prenant comme arguments ou en les renvoyant comme résultats. Cela permet un code plus abstrait et concis, améliorant ainsi la lisibilité et la maintenabilité. Les fonctions d'ordre avancé peuvent aider à réduire la duplication et la complexité du code, ce qui rend votre code plus efficace et plus facile à déboguer.
Les fonctions normales en PHP effectuent des tâches spécifiques et des résultats de retour. D'un autre côté, les fonctions d'ordre supérieur peuvent prendre une ou plusieurs fonctions en tant que paramètres, les fonctions de retour en résultats, ou avoir ces deux caractéristiques en même temps. Cela permet une plus grande flexibilité et abstraction dans votre code, vous permettant de créer des fonctions plus complexes avec moins de code.
Bien sûr, considérons la fonction array_map
dans PHP, qui est une fonction d'ordre supérieur. Il prend la fonction de rappel et le tableau sous forme de paramètres, applique la fonction de rappel à chaque élément du tableau et renvoie un nouveau tableau contenant les résultats.
// 我们将传递给高阶函数的简单用户定义函数 function echoHelloWorld() { echo "Hello World!"; } // 接受函数作为输入并调用它的高阶函数 function higherOrderFunction(callable $func) { $func(); } // 调用我们的高阶函数并传入我们的echoHelloWorld()函数。 // 请注意,我们只将名称作为字符串传递,没有括号。 // 这将输出 "Hello World!" higherOrderFunction('echoHelloWorld');
Les fonctions d'ordre élevé en PHP offrent de multiples avantages. Ils permettent un code plus abstrait et concis, ce qui peut améliorer la lisibilité et la maintenabilité. Ils peuvent également aider à réduire la duplication et la complexité du code, ce qui rend votre code plus efficace et plus facile à déboguer. De plus, les fonctions d'ordre supérieur peuvent faciliter la réutilisation du code car vous pouvez transmettre différentes fonctions à des fonctions d'ordre supérieur pour obtenir différents comportements.
Bien que les fonctions d'ordre supérieur offrent de nombreux avantages, ils peuvent également avoir des inconvénients. Ils rendent parfois le code difficile à comprendre et à déboguer, en particulier pour les développeurs qui ne connaissent pas le concept de programmation fonctionnelle. De plus, l'utilisation de fonctions d'ordre supérieur peut parfois conduire à des frais généraux de performances, car ils impliquent souvent la création et l'appel d'autres fonctions.
Créer votre propre fonction d'ordre supérieur dans PHP nécessite de définir une fonction qui peut accepter une ou plusieurs fonctions comme paramètres, renvoyer la fonction en conséquence ou avoir les deux caractéristiques. Voici un exemple simple d'une fonction d'ordre supérieur simple qui prend une fonction comme un argument et l'applique à une valeur:
// 返回PHP中名为trim()的现有函数。注意它是一个简单的字符串,没有括号。 function trimMessage1() { return 'trim'; } // 这是一个使用匿名内联函数的示例 function trimMessage2() { return function($text) { return trim($text); }; } // 返回'trim'函数 $trim1 = trimMessage1(); // 使用我们的字符串进行修剪并调用它 echo $trim1(' hello world '); // 返回内部调用'trim'的匿名函数 $trim2 = trimMessage1(); // 使用我们的字符串进行修剪并再次调用它 echo $trim2(' hello world ');
Oui, les fonctions d'ordre supérieur dans PHP peuvent renvoyer plusieurs fonctions. Cela se fait généralement en renvoyant un tableau de fonctions. Cependant, n'oubliez pas que chaque fonction retournée a sa propre portée et ne partage pas de variables avec d'autres fonctions retournées.
Oui, les fonctions d'ordre supérieur dans PHP peuvent accepter les fonctions de différentes lunettes. En effet, PHP prend en charge les fonctions de première classe, ce qui signifie que les fonctions peuvent être transmises sous forme de paramètres à d'autres fonctions, renvoyées par d'autres fonctions et affectées aux variables.
Les fermetures en PHP sont une fonction anonyme qui capture les variables dans les lunettes environnantes. Ils sont souvent utilisés avec des fonctions d'ordre supérieur car ils permettent la création de fonctions qui accèdent à plus de données que leurs paramètres. Ceci est très utile pour créer un code plus flexible et réutilisable.
Oui, PHP fournit des fonctions d'ordre supérieur intégrées. Certains exemples incluent array_map
, array_filter
et array_reduce
. Ces fonctions prennent la fonction de rappel comme un argument et l'appliquent aux éléments du tableau de diverses manières.
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!