Maison > développement back-end > tutoriel php > Comprendre en profondeur comment l'injection de dépendances réalise le découplage

Comprendre en profondeur comment l'injection de dépendances réalise le découplage

Guanhui
Libérer: 2023-04-08 16:54:01
avant
2185 Les gens l'ont consulté

Comprendre en profondeur comment l'injection de dépendances réalise le découplage

Chapitre 1 : Xiao Ming et son téléphone portable

Il était une fois un homme nommé Xiao Ming

Xiao Ming a trois passe-temps principaux, fumer et boire... Ahem, désolé, je me suis trompé de plateau. Il devrait s'agir de parcourir Zhihu, de jouer à King Pesticide et de récupérer des enveloppes rouges WeChat

Comprendre en profondeur comment linjection de dépendances réalise le découplage

Les trois principaux passe-temps de Xiao Ming

Nous utilisons un simple pseudo-code pour créer un Un tel Xiao Ming

class Ming extends Person
{
    private $_name;
    private $_age;
    function read()
    {
        //逛知乎
    }
    function  play()
    {
        //玩农药
    }
    function  grab()
    {
        //抢红包
    }
}
Copier après la connexion

Cependant, en tant qu'être humain, Xiao Ming n'a aucun moyen de réaliser les fonctions ci-dessus par lui-même. Il doit compter sur un téléphone portable, alors il a acheté un iPhone6. Ensuite, fabriquons un iPhone6.

class iPhone6 extends Iphone
{
    function read($user="某人")
    {
        echo $user."打开了知乎然后编了一个故事 \n";
    }
    function play($user="某人")
    {
        echo $user."打开了王者农药并送起了人头 \n";
    }
    function grab($user="某人")
    {
        echo $user."开始抢红包却只抢不发 \n";
    }
}
Copier après la connexion

Xiao Ming chérit beaucoup son nouveau téléphone portable et le garde fermement dans sa main tous les jours, alors Xiao Ming devient comme ça

class Ming extends Person
{
    private $_name;
    private $_age;
    public function  __construct()
    {
        $this->_name = '小明';
        $this->_age = 26;
    }
    function read()
    {
        //……  省略若干代码
        (new iPhone6())->read($this->_name); //逛知乎
    }
    function  play()
    {
        //……  省略若干代码
        (new iPhone6())->play($this->_name);//玩农药
    }
    function  grab()
    {
        //……  省略若干代码
        (new iPhone6())->grab($this->_name);//抢红包
    }
}
Copier après la connexion

Aujourd'hui c'est samedi, Xiao Ming n'est pas obligé de le faire aller travailler, alors il s'est levé, a parcouru Zhihu, a joué à King Pesticide et a attrapé une enveloppe rouge.

$ming = new Ming();  //小明起床
$ming->read();
$ming->play();
$ming->grab();
Copier après la connexion

À ce moment, nous pouvons voir le résultat dans la ligne de commande comme suit

Xiao Ming a ouvert Zhihu et a inventé une histoire

Xiao Ming a ouvert le King Pesticide et l'a envoyé

Xiao Ming a commencé à récupérer l'enveloppe rouge mais n'a pu que la saisir sans la donner

Ce jour-là, Xiao Ming a eu une vie épanouie. Il sentait qu'il était la personne la plus heureuse. dans le monde.

Chapitre 2 : Le bonheur et la tristesse de Xiao Ming

Xiao Ming et son téléphone portable ont passé un merveilleux moment ensemble Quand il avait du temps libre, il s'est embrassé en utilisant son téléphone portable. téléphone, parcourant Zhihu, parcourant Weibo et jouant à des jeux, il sentait qu'il n'avait pas du tout besoin d'une petite amie, tant qu'il avait son téléphone portable à ses côtés, il serait satisfait.

Mais qui aurait pensé que les mises à jour du système les unes après les autres brisaient complètement son rêve. Son téléphone devenait de plus en plus lent et la durée de vie de la batterie devenait de plus en plus courte, jusqu'au jour où, dans le vent froid, son téléphone portable. je n'ai finalement pas supporté le froid et je l'ai éteint sans regarder en arrière.

Xiao Ming était très triste. Il s'est rendu compte qu'il devait changer de téléphone portable.

Afin d'obtenir une meilleure expérience utilisateur, Xiao Ming a serré les dents et a acheté un iPhone. L'un des problèmes qu'il a rencontré était qu'il était trop dépendant de l'iPhone 6 d'origine, et ils étaient profondément couplés. voulait changer de téléphone, il prendrait un couteau pour se transformer et supprimer toutes les méthodes de son corps. Tous les iphone6 ​​ont été remplacés par des iphoneX.

Long processus de transformation

Après un long processus de transformation, Xiao Ming a finalement remplacé tous les iphone6 ​​​​dans le code par iphoneX. Même si c'est très dur, Xiao Ming se sent heureux.

Xiao Ming a donc volontiers emmené son téléphone portable au travail, mais a été volé par un voleur sur le chemin du retour. En cas d'urgence, Xiao Ming n'avait d'autre choix que de réutiliser l'iPhone 6 qui venait d'être abandonné. Cependant, lorsqu'il a pensé au long processus de transformation, Xiao Ming s'est senti indiciblement lésé. Il s'est senti trop dépendant de son téléphone portable. se sentait-il si déprimé à chaque fois que quelque chose n'allait pas avec son téléphone portable ? Il doit se transformer. Il ne s'agit pas simplement de mettre la charrue avant les bœufs. Il a crié au ciel, je ne veux pas. pour contrôler mon téléphone portable.

Le Créateur dans le ciel, c'est-à-dire moi en tant que programmeur, a entendu son cri, et je lui ai dit, tu n'as plus besoin de contrôler ton téléphone, laisse-moi le gérer, donne-moi le contrôle . C’est ce qu’on appelle l’inversion du contrôle.

Chapitre 3 : La sagesse du Créateur

Xiao Ming a entendu mes paroles. Il était à la fois heureux et un peu effrayé. Il s'est agenouillé et s'est incliné plusieurs fois. pieusement. Il a dit : « Il s'avère que vous êtes le créateur légendaire, Dieu Bagmek. Je vous ai entendu dire les quatre mots « inversion de contrôle », qui consiste à vous confier le contrôle du téléphone portable de mes mains, mais c'est juste votre idée. Quelle méthode peut-on utiliser pour réaliser une inversion de contrôle et me permettre de continuer à utiliser mon téléphone portable ? "

"Ha", en tant que créateur, je suis complètement dédaigneux. Après cela, j'en ai jeté quatre. de grands mots, "Injection de dépendance !"

Ensuite, le grand moi a commencé à apporter des modifications inhumaines à Xiao Ming, comme suit

class Ming extends Person
{
    private $_name;
    private $_age;
    private $_phone; //将手机作为自己的成员变量
    public function  __construct($phone)
    {
        $this->_name = '小明';
        $this->_age = 26;
        $this->_phone = $phone;
        echo "小明起床了 \n";
    }
    function read()
    {
        //……  省略若干代码
        $this->_phone->read($this->_name); //逛知乎
    }
    function  play()
    {
        //……  省略若干代码
        $this->_phone->play($this->_name);//玩农药
    }
    function  grab()
    {
        //……  省略若干代码
        $this->_phone->grab($this->_name);//抢红包
    }
}
Copier après la connexion

Ensuite, simulons l'exécution de Xiao Ming Un jour

$phone = new IphoneX(); //创建一个iphoneX的实例
if($phone->isBroken()){//如果iphone不可用,则使用旧版手机
    $phone = new Iphone6();
}
$ming = new Ming($phone);//小明不用关心是什么手机,他只要玩就行了。
$ming->read();
$ming->play();
$ming->grab();
Copier après la connexion

Voyons d'abord si l'iPhone Le téléphone portable est injecté directement dans son corps. Il n'a pas besoin de se soucier du téléphone portable qu'il tient, il lui suffit de l'utiliser directement.

Il s'agit d'une injection de dépendance.

Chapitre 4 : Les idées de Xiao Ming

La vie de Xiao Ming a commencé à devenir plus simple et il a passé tout le temps qu'il économisait à écrire des notes dans votre cahier

Avant, j'avais un fort désir de contrôler et je comptais trop sur mon téléphone portable, ce qui rendait le couplage entre moi et mon téléphone portable trop élevé. Tant qu'il y avait un léger problème avec mon téléphone portable, je. Je devrais me transformer. C'est vraiment une perte de temps. C'est facile de se tromper. Depuis que j'ai donné le contrôle au Créateur, Il a déjà choisi un téléphone portable pour moi avant de me réveiller chaque jour. J'ai juste besoin de jouer avec comme d'habitude, sans me soucier de quel type de téléphone portable il s'agit. Même s'il y a un problème avec le téléphone portable, il peut être résolu directement par le Créateur. Il n'est pas nécessaire de le modifier moi-même. J'ai maintenant acheté sept téléphones portables et je les ai remis au Créateur. je suis si heureux!

J'ai également acquis cette idée : si l'implémentation de la fonction d'une classe A nécessite l'aide de la classe B, alors la classe B est dite être une dépendance de la classe A. Si la classe est instanciée à l'intérieur de la classe A, B , alors il y aura un couplage élevé entre les deux. Une fois qu'il y aura un problème avec la classe B, la classe A devra également être transformée. S'il existe de nombreuses situations de ce type et qu'il existe de nombreuses dépendances entre chaque classe, il y aura alors des conflits. Si tout le corps est affecté par une seule attaque, le programme sera extrêmement difficile à maintenir et des problèmes surviendront facilement. Pour résoudre ce problème, il est nécessaire d'extraire le contrôle de la classe A de la classe B et de le remettre à un tiers. L'inversion du contrôle vers un tiers est appelée inversion de contrôle (IOC Inversion Of Control). L'inversion du contrôle est une idée et un résultat possible qui peut résoudre le problème, et l'injection de dépendances (Dependency Injection) est sa méthode de mise en œuvre la plus typique. Un tiers (nous l'appelons un conteneur IOC) contrôle la dépendance et l'injecte dans la classe A via des méthodes telles que des constructeurs, des attributs ou des modèles d'usine, découplant ainsi dans une large mesure la classe A et la classe B.

Tutoriel recommandé : "Tutoriel PHP"

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!

Étiquettes associées:
source:zhihu.com
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal