PHP Master | Injection de dépendance avec bouton
Points de base
- L'injection de dépendance est un concept clé dans le développement d'applications, et en injectant les dépendances dans les modules plutôt que de les coder dur, vous pouvez écrire un code plus efficace et plus maintenable.
- Pimple est un simple conteneur d'injection de dépendance qui utilise la fermeture de PHP pour définir les dépendances de manière gérable, aidant à maintenir votre code maintenable.
- Les deux principales techniques d'injection de dépendances sont l'injection de dépendance basée sur le constructeur et l'injection basée sur le secteur, chacune avec ses propres avantages et inconvénients.
- Pimple prend en charge le principe sec du développement de logiciels en agissant comme un conteneur qui définit les dépendances, en évitant la duplication, en facilitant la gestion et la centralisation des services dans les applications.
- Pimple fournit également des fonctionnalités avancées telles que la possibilité de renvoyer la même instance à l'aide d'objets partagés, et la possibilité de modifier dynamiquement les fermetures existantes sans affecter l'implémentation d'origine.
Dans le développement d'applications, nous essayons de créer des modules autonomes pour réutiliser le code dans les projets futurs. Cependant, la création de modules complètement indépendants qui fournissent des fonctionnalités utiles sont difficiles; C'est là que l'injection de dépendance est utile, car elle nous permet d'injecter les dépendances nécessaires pour que le code fonctionne correctement sans les coder dur dans le module. Pimple est un simple conteneur d'injection de dépendance qui utilise la fermeture de PHP pour définir les dépendances de manière gérable. Dans cet article, nous explorerons le problème des dépendances à code dur, comment l'injection de dépendance résout ces problèmes et comment utiliser Pimple pour faciliter l'injection de dépendance à la dépendance.
Problème de dépendances spécifiques
Lors de la rédaction d'applications, nous utilisons de nombreuses classes PHP. Une classe peut avoir besoin d'appeler des méthodes d'une ou plusieurs autres classes pour fournir les fonctionnalités attendues, nous disons donc que la première classe dépend d'autres classes. Par exemple:
<?php class A { public function a1() { $b = new B(); $b->b1(); } }
La classe A dépend de la classe B. Si la classe B n'est pas disponible, le code ci-dessus ne fonctionnera pas. De plus, chaque fois que nous cocodions en dur la création d'un objet dans la classe, nous aurons des dépendances spécifiques à la classe. Les dépendances spécifiques sont un obstacle à la rédaction de code testable. Une meilleure approche consiste à fournir un objet de classe B à la classe A. Ces objets peuvent être fournis par le constructeur de A ou la méthode du secteur. Avant de discuter plus approfondie, regardons un scénario plus réaliste.
Partager du contenu sur les sites de réseaux sociaux est très courant de nos jours, et la plupart des sites Web affichent directement leurs flux de profil social sur leurs sites Web. Supposons que nous ayons une classe appelée SocialFeeds qui génère des flux à partir de sites sociaux tels que Twitter, Facebook, Google, etc. Créez des classes distinctes pour gérer chacun de ces services. Ici, nous examinerons la classe Twitterservice qui interagit avec Twitter. La classe SocialFeeds utilise Twitterservice pour demander des flux Twitter. Twiterservice interagit avec la base de données pour récupérer des jetons utilisateur spécifiques qui accèdent à l'API. Le jeton est transmis à la classe OAuth, qui récupère le flux à l'aide du jeton fourni et le renvoie à la classe SocialFeeds.
<?php class A { public function a1() { $b = new B(); $b->b1(); } }
<?php class SocialFeeds { public function getSocialFeeds() { $twService = new TwitterService(); echo $twService->getTweets(); } }
<?php class TwitterService { public function getTweets() { $db = new DB(); $query = "Query to get user token from database"; $token = $db->getQueryResults($query); $oauth = new OAuth(); return $oauth->requestTwitterFeed($token); } }
<?php class OAuth { public function requestTwitterFeed($token) { // Retrieve and return twitter feed using the token } }
Il est évident que SocialFeeds repose sur Twitterservice. Mais Twitterservice dépend de la DB et de l'OAuth, de sorte que SocialFeeds dépendent indirectement DB et OAuth. Alors, quel est le problème? Socialfeeds s'appuie sur la mise en œuvre concrète de trois classes, il est donc impossible de tester les sociaux-sociétés séparément sans la véritable mise en œuvre d'autres classes. Ou supposons que nous voulons utiliser une base de données différente ou un autre fournisseur OAuth. Dans ce cas, nous devons remplacer la classe existante par la nouvelle classe tout au long du code.
Correction des dépendances spécifiques
La solution à ces dépendances est simple, c'est-à-dire fournir dynamiquement des objets si nécessaire sans utiliser d'implémentations concrètes. Il existe deux types de techniques qui peuvent injecter des dépendances: l'injection de dépendance basée sur le constructeur et l'injection basée sur le secteur.
Injection basée sur le constructeur
En utilisant l'injection de dépendance basée sur le constructeur, l'objet de dépendance est créé à l'extérieur et passé comme paramètre au constructeur de la classe. Nous pouvons attribuer ces objets aux variables de classe et les utiliser n'importe où dans la classe. L'injection basée sur le constructeur de la classe SocialFeeds est la suivante:
<?php class DB { public function getQueryResults($query) { // Get results from database and return token } }
Une instance de Twitterservice est passé comme un objet au constructeur. SocialFeeds repose toujours sur Twitterservice, mais maintenant nous sommes libres de fournir différentes versions des fournisseurs de services Twitter, et même des objets simulés à des fins de test. En ce qui concerne Twitterservice, les classes DB et OAuth sont également définies de la même manière.
<?php class SocialFeeds { public $twService; public function __construct($twService) { $this->twService = $twService; } public function getSocialFeeds() { echo $this->twService->getTweets(); } }
injection basée sur le secteur
En utilisant l'injection basée sur le secteur, les objets sont fournis par des méthodes de setter au lieu des constructeurs. Ce qui suit est la mise en œuvre de l'injection de dépendance basée sur le setter de la classe SocialFeeds:
<?php $db = new DB(); $oauth = new OAuth(); $twService = new TwitterService($db, $oauth); $socialFeeds = new SocialFeeds($twService); $socialFeeds->getSocialFeeds();
Le code d'initialisation comprend désormais DB et OAuth ressemble à ceci:
<?php class SocialFeeds { public $twService; public function getSocialFeeds() { echo $this->twService->getTweets(); } public function setTwitterService($twService) { $this->twService = $twService; } }
Constructeur et injection de setter
Sélectionner l'injection basée sur le constructeur ou l'injection basée sur le secteur dépend de vous. L'injection basée sur le constructeur convient lorsque toutes les dépendances sont nécessaires pour instancier une classe. L'injection basée sur le secteur convient lorsque les dépendances ne sont pas nécessaires à chaque fois.
pros
- Constructeur - Il suffit de regarder le constructeur de la classe pour identifier toutes les dépendances de la classe
- Setor - L'ajout de nouvelles dépendances est aussi simple que d'ajouter une nouvelle méthode de setter et ne casser pas le code existant
Inconvénients
- Constructeur - L'ajout de nouvelles dépendances ajoutera des paramètres au constructeur; Setor - Nous devons rechercher les dépendances nécessaires manuellement car elles ne sont spécifiées nulle part
Le rôle de Pimple dans Di
Lorsque nous pouvons déjà injecter des dépendances en utilisant les techniques susmentionnées, vous vous demandez peut-être pourquoi vous avez besoin de bouton. Pour répondre à cette question, nous devons regarder le principe sec.
Ne vous répétez pas (sec) est un principe du développement logiciel qui vise à réduire la duplication de diverses informations, ce qui est particulièrement utile dans les architectures multicouches. L'énoncé du principe sec est que "chaque fragment de connaissance doit avoir une représentation unique, claire et faisant autorité dans un système" - WikipediaConsidérez l'exemple d'injection basé sur le constructeur. Chaque fois que nous voulons un objet de la classe SocialFeed, nous devons répéter l'intégralité du processus de configuration d'instanciation et de transmission de ses dépendances. Selon Dry, ce code doit être évité pour éviter les problèmes de maintenance. Pimple agit comme un conteneur qui définit ces dépendances pour éviter la duplication. Regardons un exemple simple pour voir comment fonctionne Pimple.
<?php class A { public function a1() { $b = new B(); $b->b1(); } }
<?php class SocialFeeds { public function getSocialFeeds() { $twService = new TwitterService(); echo $twService->getTweets(); } }
Utilisation avancée du pimp
Dans le scénario ci-dessus, Pimple renvoie une nouvelle instance de chaque classe de la fermeture à chaque fois qu'il est demandé. Dans certains cas, nous devons utiliser le même objet sans initialiser une nouvelle instance à chaque fois, comme la connexion à une base de données en est un exemple parfait. Pimple offre la possibilité de renvoyer la même instance à l'aide d'un objet partagé.
<?php class A { public function a1() { $b = new B(); $b->b1(); } }
<?php class SocialFeeds { public function getSocialFeeds() { $twService = new TwitterService(); echo $twService->getTweets(); } }
Résumé
La gestion des dépendances est l'une des tâches les plus importantes et les plus difficiles du développement d'applications Web. Nous pouvons utiliser l'injection de dépendance des constructeurs et des méthodes de setter pour les gérer efficacement. Cependant, l'injection de dépendance elle-même a également quelques problèmes, et Pimple résout ces problèmes en fournissant un conteneur léger pour créer et stocker les dépendances d'objets de manière sèche. N'hésitez pas à partager votre expérience en gestion de dépendances dans votre projet et à vos réflexions sur Pimple en tant que conteneur d'injection de dépendance dans les commentaires ci-dessous.
FAQ sur l'injection de dépendance avec Pimple (FAQ)
Qu'est-ce que Pimple et pourquoi est-il utilisé en PHP?Pimple est un simple conteneur d'injection de dépendance PHP qui vous permet de gérer et de centraliser les services dans votre application. Il est utilisé dans PHP, ce qui rend le code plus flexible, réutilisable et plus facile à tester. En utilisant Pimple, vous pouvez instancier des objets en un seul endroit et les injecter dans différentes parties de votre application, réduisant le besoin de l'état global et facilitant votre code à maintenir et à tester.
Comment fonctionne Pimple?
Pimple fonctionne en stockant les définitions de service dans les conteneurs. Ces définitions sont appelables (fonction ou méthode) et elles renvoient les instances du service. Lorsque vous accédez à un service à partir d'un conteneur, Pimple exécute la définition de service pour créer un objet de service. Cela vous permet de gérer les services de manière centralisée et de partager des services tout au long de l'application.
Comment installer Pimple?
Pimple peut être installé à l'aide de Composer (outil de gestion de la dépendance de PHP). Vous pouvez installer Composer à l'échelle mondiale sur votre système, puis introduire Pimple dans votre projet en exécutant la commande
. composer require pimple/pimple
Comment définir un service dans Pimple?
Dans Pimple, vous pouvez définir un service en attribuant un objet appelant à une clé dans un conteneur. L'objet appelable doit renvoyer une instance du service. Par exemple, vous pouvez définir un service pour la classe d'expéditeur de messagerie comme ceci:
$container['mailer'] = function ($c) { return new Mailer($c['smtp']); };
Dans cet exemple, le service d'expéditeur de courrier est défini comme une nouvelle instance de la classe Mailer, où le service SMTP est injecté comme une dépendance.
Comment accéder aux services à Pimple?
Vous pouvez accéder aux services dans Pimple à l'aide de la notation du tableau avec des clés de service. Par exemple, vous pouvez accéder au service d'expéditeur de messagerie comme ceci: $mailer = $container['mailer'];
. Lorsque vous accédez à un service, Pimple exécute la définition de service et renvoie l'objet de service.
Comment partager des services dans Pimple?
Par défaut, Pimple renvoie une nouvelle instance du service chaque fois qu'il accède au service. Si vous souhaitez partager le service et renvoyer la même instance à chaque fois, vous pouvez utiliser la méthode share()
. Par exemple, vous pouvez partager le service d'expéditeur de messagerie comme ceci: $container['mailer'] = $container->share(function ($c) { return new Mailer($c['smtp']); });
.
Puis-je étendre le service en bouton?
Oui, vous pouvez utiliser la méthode extend()
pour étendre les services dans Pimple. Cela vous permet de modifier le service après l'avoir défini. Par exemple, vous pouvez étendre le service d'expéditeur de messagerie comme celui-ci pour ajouter une configuration supplémentaire:
$container['mailer'] = $container->extend('mailer', function ($mailer, $c) { $mailer->setFrom($c['email.from']); return $mailer; });
Dans cet exemple, la méthode setFrom()
est appelée sur le service d'expéditeur de courrier à l'aide du service email.from
comme paramètre.
Comment protéger les paramètres dans Pimple?
Dans Pimple, vous pouvez utiliser la méthode protect()
pour protéger les paramètres (qui ne doivent pas être considérés comme des paramètres des services). Cela vous permet de stocker des valeurs dans un conteneur sans les traiter comme des définitions de service. Par exemple, vous pouvez protéger la valeur de configuration comme ceci: $container['config.value'] = $container->protect(function () { return 'value'; });
.
Comment utiliser Pimple dans un projet?
Vous pouvez utiliser Pimple dans un projet en créant une nouvelle instance de la classe Pimplicontainer et en définissant un service là-bas. Vous pouvez ensuite accéder au service à partir du conteneur où vous en avez besoin dans l'application. Cela vous permet de gérer les services de manière centralisée et de les injecter dans différentes parties de votre application.
Quels sont les avantages de l'utilisation de bouton?
Pimple offre de nombreux avantages pour le développement de PHP. Il rend votre code plus flexible car il vous permet de gérer les services de manière centralisée. Il rend votre code plus facile à réutiliser car il vous permet de partager des services tout au long de votre application. Il rend votre code plus facile à tester car il vous permet d'injecter des services simulés pour les tests. En utilisant Pimple, vous pouvez améliorer la qualité de votre code et faciliter le maintien et le test.
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!

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds











Dans PHP, Password_Hash et Password_verify Les fonctions doivent être utilisées pour implémenter le hachage de mot de passe sécurisé, et MD5 ou SHA1 ne doit pas être utilisé. 1) Password_hash génère un hachage contenant des valeurs de sel pour améliorer la sécurité. 2) Password_verify Vérifiez le mot de passe et assurez-vous la sécurité en comparant les valeurs de hachage. 3) MD5 et SHA1 sont vulnérables et manquent de valeurs de sel, et ne conviennent pas à la sécurité de mot de passe moderne.

PHP et Python ont chacun leurs propres avantages et choisissent en fonction des exigences du projet. 1.Php convient au développement Web, en particulier pour le développement rapide et la maintenance des sites Web. 2. Python convient à la science des données, à l'apprentissage automatique et à l'intelligence artificielle, avec syntaxe concise et adaptée aux débutants.

PHP est largement utilisé dans le commerce électronique, les systèmes de gestion de contenu et le développement d'API. 1) E-commerce: Utilisé pour la fonction de panier et le traitement des paiements. 2) Système de gestion du contenu: utilisé pour la génération de contenu dynamique et la gestion des utilisateurs. 3) Développement des API: Utilisé pour le développement de l'API RESTful et la sécurité de l'API. Grâce à l'optimisation des performances et aux meilleures pratiques, l'efficacité et la maintenabilité des applications PHP sont améliorées.

Le type PHP invite à améliorer la qualité et la lisibilité du code. 1) Conseils de type scalaire: Depuis PHP7.0, les types de données de base sont autorisés à être spécifiés dans les paramètres de fonction, tels que INT, Float, etc. 2) Invite de type de retour: Assurez la cohérence du type de valeur de retour de fonction. 3) Invite de type d'union: Depuis PHP8.0, plusieurs types peuvent être spécifiés dans les paramètres de fonction ou les valeurs de retour. 4) Invite de type nullable: permet d'inclure des valeurs nulles et de gérer les fonctions qui peuvent renvoyer les valeurs nulles.

PHP est toujours dynamique et occupe toujours une position importante dans le domaine de la programmation moderne. 1) La simplicité de PHP et le soutien communautaire puissant le rendent largement utilisé dans le développement Web; 2) sa flexibilité et sa stabilité le rendent exceptionnelle dans la gestion des formulaires Web, des opérations de base de données et du traitement de fichiers; 3) PHP évolue et optimise constamment, adapté aux débutants et aux développeurs expérimentés.

PHP est principalement la programmation procédurale, mais prend également en charge la programmation orientée objet (POO); Python prend en charge une variété de paradigmes, y compris la POO, la programmation fonctionnelle et procédurale. PHP convient au développement Web, et Python convient à une variété d'applications telles que l'analyse des données et l'apprentissage automatique.

PHP et Python ont leurs propres avantages et inconvénients, et le choix dépend des besoins du projet et des préférences personnelles. 1.Php convient au développement rapide et à la maintenance des applications Web à grande échelle. 2. Python domine le domaine de la science des données et de l'apprentissage automatique.

L'utilisation de déclarations de prétraitement et l'APD dans PHP peut effectivement empêcher les attaques d'injection SQL. 1) Utilisez PDO pour vous connecter à la base de données et définir le mode d'erreur. 2) Créez des instructions de prétraitement via la méthode de préparation et transmettez des données à l'aide des espaces réservés et exécutez des méthodes. 3) Traitez les résultats de la requête et assurez la sécurité et les performances du code.
