Maison > développement back-end > tutoriel php > Programmation fonctionnelle dans PHP: fonctions d'ordre supérieur

Programmation fonctionnelle dans PHP: fonctions d'ordre supérieur

Jennifer Aniston
Libérer: 2025-02-08 11:10:12
original
681 Les gens l'ont consulté

Functional Programming in PHP: Higher-order Functions

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.

Points de base

  • Une fonction d'ordre supérieur dans PHP fait référence à une fonction qui peut accepter une ou plusieurs fonctions en entrée ou renvoyer une fonction en sortie. Cette fonctionnalité améliore la flexibilité du code pour une extension facile et une réutilisation du code.
  • Dans PHP, le mot-clé 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.
  • PHP contient des fonctions d'ordre supérieur intégrées telles que 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.
  • La création d'une fonction d'ordre supérieur PHP personnalisé nécessite de définir une fonction qui accepte une ou plusieurs fonctions comme paramètres, renvoie une fonction en conséquence ou qui a les deux caractéristiques. Par exemple, une fonction appelée calc() prend plusieurs fonctions d'entrée et fonctionne sur plusieurs paramètres.
  • Les fonctions d'ordre élevé peuvent offrir de nombreux avantages, tels que la réduction du code de la redondance de redondance. Cependant, pour les développeurs qui ne connaissent pas le concept de programmation fonctionnelle, ils rendent parfois le code difficile à comprendre et à déboguer.

Fonction de première classe

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.)

Qu'est-ce qu'une fonction d'ordre supérieur?

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

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

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.

Pourquoi utiliser ou créer des fonctions d'ordre supérieur?

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.

Ajouter une flexibilité de code

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.

facile à étendre le code

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().

imiter les fonctions des autres langues

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é.

Exemple de fonctions d'ordre supérieur existantes dans PHP

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.

combinaison dynamique avancée: array_map et array_filter

// 我们将传递给高阶函数的简单用户定义函数
function echoHelloWorld() {
  echo "Hello World!";
}

// 接受函数作为输入并调用它的高阶函数
function higherOrderFunction(callable $func) {
  $func();
}

// 调用我们的高阶函数并传入我们的echoHelloWorld()函数。
// 请注意,我们只将名称作为字符串传递,没有括号。
// 这将输出 "Hello World!"
higherOrderFunction('echoHelloWorld'); 
Copier après la connexion
Copier après la connexion
Copier après la connexion

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

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] 的数组
Copier après la connexion

Comment créer vos propres fonctions d'ordre supérieur

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] 的数组
Copier après la connexion

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调用自定义消息!');
Copier après la connexion

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.

Comparaison avec d'autres langues avec des fonctions d'ordre supérieur

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.

Comparaison côte à côte avec Python et JavaScript

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

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

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!
# 调用函数之后打印
Copier après la connexion

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.

Brève description des fonctions lambda / anonymes

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.

Conclusion

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!

FAQS pour les fonctions d'ordre avancé dans PHP

Quelle est l'importance des fonctions d'ordre supérieur en PHP?

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.

Quelles sont les différences entre les fonctions d'ordre supérieur et les fonctions ordinaires en PHP?

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.

Pouvez-vous fournir des exemples de fonctions d'ordre supérieur dans PHP?

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

Quels sont les avantages de l'utilisation de fonctions d'ordre supérieur en PHP?

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.

Y a-t-il un inconvénient de l'utilisation de fonctions d'ordre supérieur dans PHP?

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.

Comment créer ma propre fonction d'ordre supérieur dans PHP?

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

Les fonctions d'ordre supérieur en PHP peuvent-elles renvoyer plusieurs fonctions?

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.

Les fonctions d'ordre supérieur dans PHP peuvent-elles accepter les fonctions de différentes lunettes?

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.

Quelle est la relation entre les fonctions d'ordre supérieur en PHP et les fermetures?

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.

Y a-t-il des fonctions d'ordre supérieur intégré dans PHP?

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!

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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal