Maison  >  Article  >  développement back-end  >  PHP : injection de dépendances, inversion de contrôle, principe d'inversion de dépendances

PHP : injection de dépendances, inversion de contrôle, principe d'inversion de dépendances

不言
不言original
2018-04-20 11:53:181890parcourir

Le contenu de cet article concerne PHP : les principes d'injection de dépendances, d'inversion de contrôle et d'inversion de dépendances. Il a une certaine valeur de référence. Maintenant, je le partage avec vous. Les amis dans le besoin peuvent s'y référer

. Jugez le code Nous avons nos propres normes de qualité : cohésion élevée, faible couplage. Afin de résoudre ce problème, il existe de nombreux excellents modèles de conception en PHP, tels que le modèle d'usine et le modèle singleton.

Les modèles de conception reflétés dans le code sont comme l'injection de dépendances et l'inversion de contrôle.

<br>

Alors, qu'est-ce que l'injection de dépendance ?

Pour faire simple, il s'agit d'injecter les classes B et C dont dépend la classe A dans la classe A via des attributs ou des constructeurs au lieu de les instancier directement dans la classe A.

Généralement, nous écrivons du code comme celui-ci

<br>

class EmailSendByQq {    
public function send(){    
}
}
class User(){
    public function register(){       
     $email = new EmailSendByQq();       
      $email->send();    
      }
      }

Appelez la méthode d'enregistrement du registre de la classe User et instanciez la classe Email pour envoyer des e-mails. Vous pouvez voir que la classe User dépend de la classe EmailSendByQq. Sans elle, la classe User ne peut pas envoyer d'e-mails. Cependant, si nous ne voulons pas utiliser la boîte aux lettres QQ et utiliser 163 (EmailSendBy163), nous devons modifier l'instanciation de EmailSendByQq. dans chaque classe. Si on utilise le contrôle Il faudrait mieux inverser le découplage de ces deux classes

<br>

<br>
class User {    
private $_emailSendObject;    
public function __construct($emailSendObject)
    {
            $this->_emailSendObject = $emailSendObject;    
    }       
 public function register(){        
 $this->_emailSendObject->send();    
 }}
 $emailSendObject = new EmailSendByQq;$user = new User($emailSendObject);$user->register();
 //以属性的方式同样也可以实现
 class EmailSendBy163 {    
 public function send(){    
 }
 }
 class User{    
 public $emailSendObject;    
 public function register(){       
  $this->emailSendObject->send();    
  }
  }
  $user = new User;$user->emailSendObject = new EmailSendBy163();$user->register();

<br>

Ce qui précède se fait via le constructeur et le processus de transmission d'objets via des méthodes d'attribut est l'incarnation de l'injection de dépendances.

“注入”就是把一个实例传到另一个实例内部。 接下来继续把上面的代码优化,简单工厂模式的体现。

//通过EmailSendByQq和EmailSendBy163类,我们提炼出一个interface接口,让User类register方法依赖于interface接口的对象看起来更合适interface EmailSender{    public function send();}class EmailSendByQq implements EmailSender{    public function send(){    }}class EmailSendBy163 implements EmailSender{    public function send()    {        // TODO: Implement send() method.    }}class User{    public $emailSenderClass;    public function __construct(EmailSender $emailSenderObject)    {        $this->emailSenderClass = $emailSenderObject;    }    public function register(){        $this->emailSenderClass->send();    }}$user = new User(new EmailSendBy163);$user->register();

Cela réalise le découplage.

Le principe d'inversion de dépendance (DIP) est une idée de conception logicielle. Dans la conception logicielle traditionnelle, le code de la couche supérieure dépend du code de la couche inférieure. Lorsque le code de la couche inférieure change, le code de la couche supérieure doit également changer en conséquence, ce qui entraîne des coûts de maintenance élevés. L'idée centrale de DIP est que la couche supérieure définit une interface et que la couche inférieure implémente cette interface, rendant ainsi la couche inférieure dépendante de la couche supérieure, réduisant le couplage et améliorant la flexibilité de l'ensemble du système. Il s’agit d’une stratégie éprouvée qui fonctionne. <br>

Recommandations associées :

Explication détaillée des exemples de code de construction de point d'injection php

<br>

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