Maison  >  Article  >  développement back-end  >  Comprendre simplement l'injection de dépendances DI en PHP

Comprendre simplement l'injection de dépendances DI en PHP

WBOY
WBOYavant
2022-08-10 18:04:561689parcourir

Cet article vous apporte des connaissances pertinentes sur PHP, qui présente principalement des problèmes liés à l'injection de dépendances. L'injection de dépendances DI fait en fait référence à l'injection automatique de dépendances sur les classes via des constructeurs. Parlons-en ensemble, j'espère que cela vous aidera. tout le monde.

(Tutoriel recommandé : Tutoriel vidéo PHP)

Qu'est-ce que DI / Dependency Injection

Dependency Injection DI signifie en fait essentiellement que les dépendances d'une classe sont automatiquement injectées via le constructeur

En termes simples, il est Vous utilisez actuellement une classe, mais certaines méthodes ou fonctions de cette classe ne peuvent pas être complétées par cette classe seule, mais doivent être complétées avec l'aide d'une autre classe. Le signe le plus direct est que les données du paramètre sont transmises en tant qu'objet. quand. À proprement parler, vous souhaitez faire fonctionner une classe dans une autre classe. Il existe une interdépendance entre les deux classes. La méthode de transmission des paramètres est appelée injection

La raison pour laquelle l'injection de dépendances apparaît

Lorsque l'injection de dépendances n'est pas utilisée, Lorsque PHP a besoin. pour utiliser une autre classe dans une classe, il effectue souvent les opérations suivantes

Par exemple, si je dois utiliser la classe adaptateur dans la classe conteneur, elle doit être instanciée avant utilisation

Si un grand nombre de classes externes doivent être utilisé, cela entraînera un degré de couplage trop élevé, ce qui peut facilement entraîner des difficultés de maintenance ultérieures

En termes simples, cela signifie que le conteneur ne peut pas fonctionner sans classes externes, ce qu'on appelle un degré de couplage trop élevé

<?php
class container
{
    private $adapter;

    public function __construct()
    {
        $this->adapter = new adapter();
    }
}

Injection de dépendance simple

Le degré de couplage du code ci-dessus est trop élevé, ce qui conduit à l'émergence de l'injection de dépendance, principalement pour comprendre le couplage

Dans le cas suivant, il suffit de passer l'objet de classe qui a besoin à utiliser

Le paramètre de l'opération d'injection de dépendances est l'objet. Au lieu des paramètres ordinaires, avez-vous une meilleure compréhension

Mais une injection de dépendances aussi simple entraînera si vous dépendez de beaucoup de classes, ce sera très longtemps lorsque vous transmettez des paramètres, et il sera facile de se tromper

<?php
class container
{
    private $adapter;

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

Injection de dépendances de haut niveau

Afin de résoudre le problème des paramètres confus ci-dessus, l'injection de dépendances a été optimisée à ce moment

Grâce à la méthode magique, __arriver à définir l'objet

À ce stade, nous pouvons résoudre le problème du trop grand nombre de dépendances et des paramètres confus

<?php
class container
{
    public $instance = [];

    public function __set($name, $value)
    {
        $this->instance[$name] = $value;
    }
}

$container = new container();

$container->adapter = new adapter();
$container->autofelix = new autofelix();

Application d'injection de dépendances

Nous définissons d'abord une classe conteneur, qui est principalement utilisée pour injecter la classe que vous souhaitez utiliser dans le conteneur

Lors de son utilisation, il vous suffit de passer l'objet conteneur

<?php
class container
{
    public $instance = [];

    public function __set($name, $value)
    {
        $this->instance[$name] = $value;
    }
}

class adapter
{
    public $name = &#39;我是调度器&#39;;
}

$container = new container();
$container->adapter = new adapter();

class autofelix
{
    private $container;

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

    public function who($class)
    {
        return $this->container->instance[$class]->name;
    }
}

$autofelix = new autofelix($container);

$who = $autofelix->who(&#39;adapter&#39;);

var_dump($who); //我是调度器

Optimisation de haut niveau par injection de dépendances

Dans l'application ci-dessus, nous injectons directement les objets instanciés dans le conteneur

Cela entraînera tous les objets à être instancié avant d'être utilisé, entraînant une perte de ressources

Nous pouvons passer des fermetures, de cette façon, l'objet ne sera pas instancié et injecté Lorsque vous aurez besoin de l'utiliser, vous pourrez l'instancier à nouveau, ce qui peut réduire la perte de. ressources du serveur

<?php
$container = new container();
$container->adapter = new adapter();

//高阶优化
$container = new container();
$container->adapter = function () {
    return new adapter();
};

(Tutoriel recommandé :

Tutoriel vidéo 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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer