Ein Artikel über DI-Abhängigkeitsinjektion in PHP

青灯夜游
Freigeben: 2023-04-11 07:36:01
nach vorne
3516 Leute haben es durchsucht

Was ist DI-Abhängigkeitsinjektion? Der folgende Artikel vermittelt Ihnen ein tiefgreifendes Verständnis der DI-Abhängigkeitsinjektion in PHP. Ich hoffe, er wird Ihnen hilfreich sein! Was ist DI/Abhängigkeitsinjektion? Für Laien bedeutet dies, dass Sie derzeit eine Klasse betreiben, einige Methoden oder Funktionen dieser Klasse jedoch nicht von dieser Klasse allein, sondern von mit Hilfe einer anderen abgeschlossen werden können Klasse

Das direkteste Zeichen ist, wenn die Parameterdaten als Objekt übergeben werden. Streng genommen möchten Sie eine Klasse in einer anderen Klasse betreiben. Die Methode zur Übergabe von Parametern heißt injectionEin Artikel über DI-Abhängigkeitsinjektion in PHP

Der Grund Warum erscheint die Abhängigkeitsinjektion

  • Wenn die Abhängigkeitsinjektion nicht verwendet wird und php eine andere Klasse in einer Klasse verwenden muss, werden häufig die folgenden Vorgänge ausgeführt依赖注入DI 其实本质上是指对类的依赖通过构造器完成 自动注入
  • 通俗来说,就是你当前操作一个类,但是这个类的某些方法或者功能不是单单只靠这个类就能完成的,而是要 借助另一个类 的才能完成的
  • 最直接的标志就是传参数据为对象的时候。严格来说,你想在一个类中操作另一个类,这两个类之间形成了相互依赖关系,传参的方式叫 注入

依赖注入出现的原因

  • 在未使用依赖注入的时候,php 需要在一个类中使用另一个类的时候,往往都会进行如下操作
  • 比如我在 container 类中需要用到 adapter 类,就需要在使用之前进行实例化
  • 如果需要用到大量的外部类,这就会造成了 耦合度太高,很容易造成后期的 维护困难
  • 通俗的来讲,也就是 container 脱离不了外部类去工作,这就叫 耦合度太高
<?php
class container
{
    private $adapter;

    public function __construct()
    {
        $this->adapter = new adapter();
    }
}
Nach dem Login kopieren

简单的依赖注入

  • 上面的代码耦合度太高,导致了 依赖注入 的出现,主要是为了 解耦合
  • 如下案例,我们只需要将所需要操作的类对象传入即可
  • 依赖注入 操作的参数是 对象,而不是普通参数,是不是有更好的理解了
  • 但是这样的简单依赖注入,会造成如果你依赖的类很多,你传参的时候会很长,容易混乱
<?php
class container
{
    private $adapter;

    public function __construct(adapter $adapter)
    {
        $this->adapter = $adapter;
    }
}
Nach dem Login kopieren

高阶的依赖注入

  • 为了解决上面 参数混乱 的问题,这时候,依赖注入进行了优化
    通过魔术方法,__get 去设置对象
  • 这时候,我们就可以解决依赖太多,参数混乱的问题了
<?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();
Nach dem Login kopieren

依赖注入的应用

  • 我们先定义一个 容器类,主要用来向容器中 注入 你想要操作的类
  • 使用的时候,只需要传容器这一个 对象 即可
<?php
class container
{
    public $instance = [];

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

class adapter
{
    public $name = '我是调度器';
}

$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('adapter');

var_dump($who); //我是调度器
Nach dem Login kopieren

依赖注入高阶优化

  • 在上面的应用中,我们 直接 将实例化后的对象注入容器中
  • 这样会导致,所有的对象还没有被使用就会被实例化一遍,造成 资源的损耗
  • 我们可以 传入闭包,这样对象就不会被实例化而注入,当你自己需要使用的时候,再去实例化,就可以减少 服务器资源的损耗
  • Zum Beispiel, wenn ich mich in adapter in der Klasse >container verwendet werden muss, muss sie vor der Verwendung instanziiert werden. Wenn eine große Anzahl externer Klassen verwendet werden muss, führt dies zu Kopplung. Wenn sie zu hoch ist, wird es in Zukunft leicht zu Wartungsschwierigkeiten kommen. Laienhaft ausgedrückt kann container nicht ohne externe Klassen funktionieren namens Der Kopplungsgrad ist zu hoch

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

//高阶优化
$container = new container();
$container->adapter = function () {
    return new adapter();
};
Nach dem Login kopieren
Einfache Abhängigkeitsinjektion🎜🎜🎜Der Kopplungsgrad des obigen Codes ist zu hoch, was zur Entstehung von Abhängigkeitsinjektion führt code>, hauptsächlich für <code> Entkopplung🎜🎜Im folgenden Fall müssen wir nur das zu bedienende Klassenobjekt übergeben🎜🎜Dependency Injection Der Parameter der Operation ist Object, und es handelt sich nicht um einen gewöhnlichen Parameter. Aber eine so einfache Abhängigkeitsinjektion führt dazu, dass die Übergabe der Parameter sehr lange dauert. Dies ist leicht zu Verwirrung🎜🎜 rrreee🎜🎜Abhängigkeitsinjektion auf hoher Ebene🎜🎜🎜🎜Um das oben genannte Problem der Parameterverwirrung zu lösen, verwenden Sie zu diesem Zeitpunkt die Abhängigkeitsinjektion wurde optimiert
durch die magische Methode __get Gehen Sie und legen Sie das Objekt fest🎜🎜Zu diesem Zeitpunkt können wir das Problem zu vieler Abhängigkeiten und verwirrender Parameter lösen🎜🎜rrreee🎜🎜Anwendung von Abhängigkeitsinjektion🎜🎜🎜🎜Wir definieren zunächst eine Containerklasse, die hauptsächlich zum injizieren der Klasse, die Sie betreiben möchten, in den Container verwendet wird das Objekt des Containers 🎜Dies führt dazu, dass alle Objekte instanziiert werden, bevor sie verwendet werden, was zu einem Ressourcenverlust führt. 🎜🎜Wir können einen Abschluss übergeben, sodass das Objekt nicht instanziiert und injiziert wird Sie müssen es selbst verwenden und erneut instanziieren. Sie können den Verlust von Serverressourcen reduzieren

Das obige ist der detaillierte Inhalt vonEin Artikel über DI-Abhängigkeitsinjektion in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
php
Quelle:csdn.net
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage