Maison  >  Article  >  développement back-end  >  Comment utiliser PHP pour l'injection de dépendances

Comment utiliser PHP pour l'injection de dépendances

PHPz
PHPzoriginal
2023-06-06 22:01:022489parcourir

Avec le développement du génie logiciel, de plus en plus de développeurs se concentrent sur l'écriture d'applications faciles à maintenir et évolutives. Parmi eux, l'injection de dépendances (Dependency Injection) est un modèle très important, qui permet d'atteindre la testabilité, l'organisabilité et l'évolutivité des applications. En tant que langage de programmation bien connu, PHP possède également son propre conteneur d'injection de dépendances et les bibliothèques associées. Les développeurs peuvent utiliser ces outils pour implémenter l'injection de dépendances. Cet article explique comment utiliser PHP pour l'injection de dépendances.

  1. Qu'est-ce que l'injection de dépendances (DI)

Avant de commencer à introduire l'injection de dépendances en PHP, comprenons d'abord ce que sont les dépendances. L'injection de dépendances est un modèle de conception logicielle qui permet à une classe (ou une fonction) de ne plus dépendre directement des objets dont elle a besoin, mais qui est transmise de l'extérieur. Ce modèle rend le code plus flexible et évolutif car les dépendances sont déplacées vers un conteneur externe contenant toutes les dépendances, appelé conteneur d'injection de dépendances.

Dans le modèle d'injection de dépendances, nous injectons des dépendances via des constructeurs ou des méthodes Setter. Ces dépendances peuvent être d'autres objets, instances d'interface ou valeurs scalaires. Une dépendance peut être un objet ou une valeur simple, et le client d'injection de dépendances obtient ces dépendances en les transmettant en tant que paramètres au conteneur de services ou en les injectant dans des méthodes de définition de l'objet.

  1. Avantages de l'injection de dépendances

L'utilisation du modèle d'injection de dépendances peut apporter de nombreux avantages. Voici quelques-uns des principaux avantages :

  • Testabilité : l'injection de dépendances peut nous aider à effectuer des tests unitaires plus facilement, car nous pouvons facilement fournir de nouvelles implémentations simulées ou des simulacres d'objets de dépendances.
  • Flexibilité : Les dépendances entre les composants d'une application sont plus flexibles car nous pouvons modifier le comportement de l'application ou des composants en injectant des dépendances.
  • Réutilisation du code : Puisque les dépendances sont déplacées dans des conteneurs, nous pouvons réutiliser les dépendances dans différents composants.
  • Découplage de classes : le mode d'injection de dépendances découple les dépendances entre les classes. Cela rend le code plus facile à maintenir et réduit le risque de modification du code.
  1. Conteneur d'injection de dépendances PHP

Lorsque nous utilisons l'injection de dépendances en PHP, nous devons utiliser un conteneur d'injection de dépendances. Un conteneur d'injection de dépendances est un objet qui nous aide à résoudre les dépendances au moment de l'exécution. En règle générale, un conteneur d'injection de dépendances se compose de deux parties : l'enregistrement des dépendances et la résolution des dépendances.

Enregistrer des dépendances consiste à enregistrer des classes ou des interfaces dans le conteneur afin qu'elles puissent être récupérées. Lorsqu'une classe ou un objet doit dépendre d'autres objets, il peut les obtenir à partir du conteneur. Les conteneurs d'injection de dépendances peuvent également résoudre automatiquement les dépendances, ce qui est nécessaire lors de l'utilisation de conteneurs.

Maintenant, nous allons utiliser le package PHP League Container comme conteneur d'injection de dépendances. PHP League Container est un conteneur d'injection de dépendances léger qui prend en charge la résolution automatique des dépendances et l'enregistrement des classes externes.

Veuillez noter que le code suivant démontre la méthode d'enregistrement d'une classe dans le conteneur :

use LeagueContainerContainer;

$container = new Container;

$container->add('className', 'NamespaceClassName');

Nous utilisons la méthode add() pour ajouter le nom de classe 'className' est mappé à une classe avec le nom complet 'NamespaceClassName'. Lorsque le conteneur aura besoin de résoudre les dépendances de certaines classes, il utilisera l'API de réflexion pour obtenir les paramètres de la classe et les reconstruire en instances. add() 方法将对类名 'className' 的实例化映射到完全限定的名称为 'NamespaceClassName' 的类。 当容器需要解析某些类的依赖关系时,它将使用反射 API 来获取类的参数并将它们重建成实例。

  1. 依赖注入实例

让我们通过一个简单的示例来了解如何使用依赖注入来注入一个 EmailSender 依赖项。

interface EmailSenderInterface {
    public function sendEmail($to, $message);
}

class EmailSender implements EmailSenderInterface {
    public function sendEmail($to, $message) {
        return mail($to, "An email", $message);
    }
}

class User {
    protected $emailSender;

    public function __construct(EmailSenderInterface $emailSender) {
        $this->emailSender = $emailSender;
    }

    public function sendWelcomeEmail($email) {
        $this->emailSender->sendEmail($email, "Welcome to my site!");
    }
}

在上面的代码中,我们定义了一组类。 EmailSender 类表示一个邮件发送器,而 User 类用来发送欢迎邮件。 User 类需要通 __construct 方法来获取一个 EmailSender 实例,以便发送欢迎邮件。

现在,我们需要将 EmailSender 实例作为依赖注入到 User 类中。

use LeagueContainerContainer;

$container = new Container;

$container->add('EmailSender', 'EmailSender');

$user = $container->get('User', ['EmailSender']);

在上面的代码中,我们注册 EmailSender 类,并在容器中完成实例化。接下来,我们实例化 User 类,并注入 EmailSender

    Exemple d'injection de dépendance
    1. Utilisons un exemple simple pour comprendre comment utiliser l'injection de dépendance pour injecter une dépendance EmailSender.
    rrreee

    Dans le code ci-dessus, nous définissons un ensemble de classes. La classe EmailSender représente un expéditeur d'e-mails, tandis que la classe User est utilisée pour envoyer des e-mails de bienvenue. La classe User doit obtenir une instance EmailSender via la méthode __construct afin d'envoyer l'e-mail de bienvenue.

    #🎜🎜#Maintenant, nous devons injecter l'instance EmailSender en tant que dépendance dans la classe User. #🎜🎜#rrreee#🎜🎜#Dans le code ci-dessus, nous enregistrons la classe EmailSender et terminons l'instanciation dans le conteneur. Ensuite, nous instancions la classe User et injectons l'objet EmailSender pour envoyer l'e-mail. #🎜🎜##🎜🎜##🎜🎜#Bonnes pratiques pour l'utilisation de l'injection de dépendances#🎜🎜##🎜🎜##🎜🎜#Voici quelques bonnes pratiques pour l'utilisation de l'injection de dépendances : #🎜🎜#
  • Écrire du code testable : injecter des dépendances dans les méthodes les rend plus faciles à contrôler et permet de réaliser des tests unitaires.
  • Enregistrer des classes externes : Si vous utilisez d'autres bibliothèques tierces ou des classes externes, enregistrez-les auprès du conteneur afin qu'elles puissent être injectées dans la classe en cas de besoin.
  • Réduire les dépendances : Réduisez autant que possible le nombre de dépendances, ce qui peut rendre le code plus concis et plus facile à maintenir.
  • Évitez les dépendances circulaires : Éviter les dépendances circulaires peut être très important. Cela peut être résolu en utilisant la méthode Setter, le conteneur ne résoudra pas automatiquement les dépendances circulaires. L'injection de dépendances est un modèle utile qui facilite la gestion et la maintenance de votre code. Utiliser l'injection de dépendances en PHP signifie généralement utiliser un conteneur d'injection de dépendances, et il est recommandé d'utiliser le conteneur PHP League pour le développement. Nous avons démontré à travers un exemple de code comment enregistrer une classe et comment injecter des dépendances. En utilisant l’injection de dépendances, votre application sera plus efficace, plus facile à maintenir et à faire évoluer.

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:
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