De nombreux programmeurs aiment parler de programmation fonctionnelle, mais si vous leur demandez s'ils l'ont réellement utilisé, la plupart des réponses seront "non". La raison est simple: lorsque nous avons des débutants en programmation, on nous apprend à penser de manière impérative, à savoir les organigrammes et les étapes du programme. Par conséquent, cet article expliquera certains concepts importants de programmation fonctionnelle et comment écrire du code fonctionnel dans PHP.
Points clés
Concepts importants de la programmation fonctionnelle
Wikipedia définit la programmation fonctionnelle comme "un paradigme de programmation qui traite les calculs comme une évaluation des fonctions mathématiques et évite les données d'état et variables". Dans la programmation fonctionnelle, les fonctions sont considérées comme des citoyens de première classe, tandis que dans la programmation impérative, nous nous concentrons principalement sur les données et les étapes pour modifier les données pour obtenir les résultats attendus. Lorsque nous disons qu'une fonction est un citoyen de première classe, cela signifie que nous pouvons utiliser des fonctions comme nous utilisons des valeurs dans la programmation impérative. Ils peuvent être transmis sous forme de paramètres à une fonction, définis dans une autre fonction, ou même retournés en conséquence. En d'autres termes, "une fonction est une valeur". Nous en discuterons à nouveau plus tard, mais la programmation fonctionnelle a de nombreux autres concepts importants. Pour ne nommer que quelques exemples:
L'invariance fait référence au comportement qu'une fois la valeur d'une variable définie, elle ne peut pas être modifiée. Différentes langues ont des implémentations différentes;
La récursivité est également importante dans la programmation fonctionnelle. Dans la programmation impérative, lorsque nous devons manipuler des ensembles ou des tableaux, nous pouvons utiliser des structures de boucle telles que pour et pour itérer à travers chaque élément et utiliser des variables temporaires pour enregistrer la valeur actuelle. Cependant, cette approche n'est pas possible dans la programmation fonctionnelle due à l'invariance. La récursivité est la réponse, car cette comptabilité se fait implicitement via la pile d'appels. Supposons que nous voulons écrire une fonction pour trouver la somme de tous les éléments dans un tableau (oubliez l'existence de Array_sum () pour l'instant). Dans le style fonctionnel, nous écrire:
<?php function sum($array) { if (empty($array)) return 0; else return $array[0] + sum(array_slice($array, 1)); } $total = sum(array(1, 2, 3)); // 6 ?>
La liste vide reviendra 0, ce qui est notre état de base. Pour un tableau contenant plusieurs valeurs, il renvoie le résultat de l'ajout du premier élément à la somme récursive de tous les autres éléments.
Si une fonction ne modifie pas la valeur de son propre objet externe (comme les variables globales ou statiques) et n'a pas d'effets d'E / S (comme l'écriture dans les fichiers, les bases de données, etc.), la fonction est dite pour n'avoir aucun effet secondaire. De telles fonctions sont également appelées fonctions pures. Pour un ensemble de paramètres donné, la sortie de la fonction pure sera toujours la même, ce qui se traduit par une autre propriété appelée transparence de référence. Lorsqu'une fonction est référencée transparente, nous pouvons remplacer la fonction par sa valeur sans affecter le comportement du programme. Toutes les fonctions mathématiques sont des fonctions pures, tandis que les fonctions de date, rand (), etc. sont des fonctions non-pure.
Les concepts ci-dessus peuvent être mis en œuvre dans presque tous les langages de programmation, mais les fonctions citoyennes de première classe et les fonctions d'ordre supérieur sont les deux caractéristiques les plus importantes de la programmation fonctionnelle. J'ai expliqué qu'une fonction citoyenne de première classe signifie qu'une fonction peut être traitée comme une valeur. Une fonction d'ordre supérieur est une fonction qui peut prendre une fonction en tant que paramètre et peut renvoyer une fonction en conséquence. Deux fonctionnalités importantes récemment ajoutées nous permettent d'écrire des fonctions d'ordre supérieur dans PHP: les expressions et fermetures de lambda.
La fonction lambda (également connue sous le nom de fonction anonyme) n'est qu'une fonction sans nom. Lorsque nous définissons une fonction anonyme, une référence à la fonction est renvoyée, qui est stockée dans une variable pour une utilisation ultérieure. Nous utilisons cette variable pour appeler la fonction en cas de besoin. De nombreuses langues différentes adoptent ce concept. En fait, vous pouvez utiliser des fonctions lambda dans votre programmation quotidienne JavaScript, en les utilisant comme rappel pour différentes interactions utilisateur et appels AJAX.
$("#myButton").click(function () { // do something });
Ce code est très simple et facile à comprendre, ce qui peut nous faire oublier son aspect fonctionnel. PHP a introduit cette fonctionnalité puissante dans la version 5.3, qui nous permet d'écrire du code PHP de la même manière:
<?php $square = function ($arg) { return $arg * $arg; }; $value = $square(2); // 4 ?>
En parlant de fonctions, en particulier des fonctions anonymes, il est important de comprendre comment gérer la portée variable. Par exemple, JavaScript vous permet d'accéder aux variables de portée externe à l'intérieur de Lambdas, contrairement à PHP. Lambda a sa propre portée à l'intérieur, tout comme les fonctions PHP régulières.
Parfois, vous voudrez peut-être vous référer à des variables dans la portée du parent à l'intérieur de la fonction. Les fermetures sont similaires aux fonctions lambda, mais légèrement différentes, et vous pouvez accéder aux variables avec des lunettes externes. Nous pouvons utiliser "Retour à côté" et lier les variables externes en utilisant le mot-clé d'utilisation de PHP, qui a également été introduit dans PHP 5.3.
<?php function sum($array) { if (empty($array)) return 0; else return $array[0] + sum(array_slice($array, 1)); } $total = sum(array(1, 2, 3)); // 6 ?>
Dans ce cas, nous ne faisons pas de taux d'intérêt à chaque fois que la fonction est appelée. Au lieu de cela, nous le définissons en externe et utilisons le mot-clé Utiliser pour le rendre disponible à l'intérieur de la fonction.
En termes simples, certaines fonctions sont des fonctions créées à partir de fonctions existantes et leurs paramètres sont appliqués partiellement. Il vous suffit de passer les paramètres restants lorsque vous appelez la fonction créée. Nous pouvons utiliser des fermetures pour créer des fonctions partielles dans PHP. Ceci est un exemple pour trouver le volume d'une boîte en fonction de sa longueur, de sa largeur et de sa hauteur. Tous les paramètres sont facultatifs; si vous ne fournissez pas tous les paramètres, la fonction renvoie une autre fonction pour accepter les valeurs nécessaires.
$("#myButton").click(function () { // do something });
Tous les paramètres sont facultatifs. Vérifiez d'abord si l'appelant a passé tous les paramètres. Dans ce cas, nous pouvons revenir directement au volume en multipliant la longueur, la largeur et la hauteur. Si le nombre de paramètres est inférieur aux paramètres, une nouvelle fonction est renvoyée pour trouver le volume du préréglage du paramètre donné. Supposons maintenant que nous recherchons le volume d'une boîte avec une longueur fixe (par exemple 10). Cela peut être fait facilement en prenant 10 comme premier paramètre, ou nous pouvons créer une fonction partielle en prenant 10 comme premier paramètre, puis en demandant uniquement les valeurs restantes.
<?php $square = function ($arg) { return $arg * $arg; }; $value = $square(2); // 4 ?>
Le currying est un cas particulier de fonctions partielles, où vous convertissez une fonction qui accepte plusieurs paramètres en plusieurs fonctions qui acceptent chacune un seul paramètre. Par exemple, similaire à f (x, y, z) à f (x) (y) (z) (bien que la syntaxe PHP n'autorise pas les appels de fonction imbriqués comme celui-ci). Si vous souhaitez en savoir plus, Timothy Boronczyk a écrit un excellent article sur le curry avec des exemples réels.
PROS et inconvénients
Les fonctions de la programmation fonctionnelle ont de nombreuses utilisations pratiques en PHP. Par exemple, la fonction lambda est largement utilisée lors de l'utilisation des fonctions de rappel. Par exemple, en utilisant le framework Slim, vous pouvez définir l'itinéraire suivant:
<?php function sum($array) { if (empty($array)) return 0; else return $array[0] + sum(array_slice($array, 1)); } $total = sum(array(1, 2, 3)); // 6 ?>
Slim appelle la fonction de rappel lorsque l'URL demandée correspond à cette voie. Vance Lucas a écrit quelques articles sur d'autres cas d'utilisation intéressants de fonctions lambda auparavant. Encouragez la programmation sécurisée en évitant les données d'état et variables. Dans la programmation fonctionnelle, vous devez écrire des fonctions qui ne font qu'une seule chose et ne font aucun effet secondaire chacun. L'accent mis par ce paradigme sur la modularité et la simplicité de la fonction peut faciliter la déduction de votre programme en fonction de différents sous-programmes. La programmation fonctionnelle peut également vous aider à rédiger du code qui se concentre sur ce que vous souhaitez réaliser, plutôt que de gérer explicitement les événements accidentels dans le processus (comparer la récursivité à la gestion des variables de compteur de boucle). Mais n'oubliez pas que certains des avantages traditionnellement liés à la programmation fonctionnelle ne s'appliquent pas à PHP car il n'est pas conçu comme un langage de programmation fonctionnelle. Par exemple, les fonctions sans effets secondaires sont idéales pour le traitement parallèle, mais les scripts PHP ne s'exécutent pas de cette façon. Il n'est pas toujours facile de calculer le coût des fonctions récursives et paresseuses, et il peut y avoir de graves problèmes de performance en raison des frais généraux internes. Parfois, il est plus logique d'écrire des programmes avec une variabilité pour améliorer l'efficacité. Le plus grand inconvénient de la programmation fonctionnelle est peut-être qu'il a une courbe d'apprentissage très raide pour ceux qui ont été formés impérativement. Mais dans l'ensemble, la programmation fonctionnelle est amusante, et l'apprentissage vous fournira de nouveaux outils pour penser aux anciens problèmes et vous aider à grandir en tant que programmeur. Ce n'est pas une solution universelle, mais peut être appliquée à un code PHP plus propre et plus élégant au besoin.
Résumé
La programmation fonctionnelle n'est pas seulement un paradigme de programmation; Si vous pouvez faire une réflexion fonctionnelle, vous pouvez programmer fonctionnellement dans presque toutes les langues. Dans cet article, nous discutons des bases de la programmation fonctionnelle, en utilisant les capacités de PHP pour écrire et en fournir des exemples. Bien que les exemples donnés dans cet article ne soient pas pratiques pour vous, vous trouverez de nombreuses situations où les styles fonctionnels peuvent améliorer considérablement la qualité du code que vous écrivez. Essayez de chercher des cas comme celui-ci, pensez fonctionnellement et amusez-vous! images de Fotolia
Des questions fréquemment posées sur la programmation fonctionnelle PHP
La programmation fonctionnelle et la programmation orientée objet sont deux paradigmes différents utilisés en PHP. La principale différence est la façon dont ils gèrent l'état et les données. Dans la programmation fonctionnelle, les fonctions sont des citoyens de première classe et n'ont aucun concept d'État. Cela signifie que compte tenu de la même entrée, la fonction produira toujours la même sortie. La programmation orientée objet, en revanche, tourne autour des objets et de leurs interactions qui maintiennent l'état et changent avec le temps. Cela peut entraîner différentes sorties, même si l'entrée est la même.
Pour démarrer la programmation fonctionnelle avec PHP, vous devez comprendre des concepts de base tels que les fonctions pures, l'invariance et les fonctions d'ordre supérieur. Ensuite, vous pouvez commencer à écrire des fonctions qui ne modifient pas l'état et n'ont aucun effet secondaire. PHP a des fonctions intégrées qui prennent en charge la programmation fonctionnelle, telle que array_map
, array_filter
et array_reduce
. Vous pouvez également utiliser des bibliothèques comme les collections Laravel qui fournissent des emballages lisses et pratiques pour utiliser des réseaux de données.
La programmation fonctionnelle dans PHP vous permet d'écrire un nettoyant et plus facile à lire le code. Il peut vous aider à éviter les problèmes de programmation courants tels que les effets secondaires et les modifications d'état, ce qui peut rendre votre code plus facile à prévoir et à tester. La programmation fonctionnelle permet également un code plus modulaire car les fonctions peuvent être facilement combinées et réutilisées.
Bien que la programmation fonctionnelle présente ses avantages, il a également certains défis. Le PHP n'a pas été conçu à l'origine pour la programmation fonctionnelle, donc certaines fonctions peuvent ne pas être aussi puissantes ou efficaces que les langages conçus pour la programmation fonctionnelle. De plus, la programmation fonctionnelle nécessite différentes façons de penser, et la courbe d'apprentissage peut être raide pour les développeurs habitués à la programmation impérative ou orientée objet.
Oui, PHP est un langage multi-paragraphe, ce qui signifie que vous pouvez mélanger différents styles de programmation. Vous pouvez utiliser une programmation orientée objet pour les pièces d'application qui bénéficient de l'état et du comportement, et une programmation fonctionnelle pour les parties d'application qui bénéficient de fonctions apatrides sans effet secondaire. Cela vous donne la flexibilité de choisir la meilleure méthode pour chaque partie de l'application.
L'impact de la programmation fonctionnelle sur les performances de PHP peut varier. Dans certains cas, la programmation fonctionnelle peut écrire du code plus efficace car il évite les changements d'état et les effets secondaires. Cependant, dans d'autres cas, il peut être inefficace car il implique généralement la création de nouveaux objets plutôt que de modifier les objets existants. Il est important d'analyser et de tester votre code pour vous assurer qu'il répond à vos exigences de performance.
Il existe de nombreuses ressources disponibles pour apprendre la programmation fonctionnelle PHP. Certains bons points de départ incluent le manuel PHP (qui a une section sur la programmation fonctionnelle) ainsi que les tutoriels et articles en ligne. Il existe également des livres sur ce sujet, tels que la programmation fonctionnelle PHP de Gilles Crettenand.
Oui, vous pouvez utiliser la programmation fonctionnelle pour le développement Web en PHP. La programmation fonctionnelle peut vous aider à rédiger un code plus propre et plus modulaire, ce qui peut être bénéfique dans un environnement de développement Web. Cependant, n'oubliez pas que PHP est un langage multi-paragraphe, vous pouvez donc utiliser d'autres styles de programmation, tels que la programmation orientée objet.
Dans la programmation fonctionnelle, la gestion des erreurs est généralement effectuée en utilisant des monades, une structure de données qui peut représenter les calculs plutôt que les valeurs. En PHP, vous pouvez utiliser la monade peut-être pour la gestion des erreurs. Cela vous permet de relier les opérations ensemble et si des opérations échouent, le reste de la chaîne sera ignoré.
La programmation fonctionnelle peut être utilisée pour les grandes applications, mais elle dépend des exigences spécifiques de l'application. La programmation fonctionnelle peut écrire un code plus propre, plus modulaire, qui peut être bénéfique dans des environnements à grande échelle. Cependant, il peut également être inefficace dans certains cas, il est donc important de considérer les compromis.
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!