ホームページ  >  記事  >  バックエンド開発  >  PHP における DI 依存関係の挿入を簡単に理解する

PHP における DI 依存関係の挿入を簡単に理解する

WBOY
WBOY転載
2022-08-10 18:04:561676ブラウズ

この記事では、PHP に関する関連知識を提供します。主に依存性注入に関する関連問題を紹介します。依存性注入 DI は、実際にはコンストラクターを介したクラスへの依存関係を指します。自動注入、見てみましょう, 皆様のお役に立てれば幸いです。

(推奨チュートリアル: PHP ビデオ チュートリアル)

DI/依存性注入とは

依存性注入 DI実際、これは基本的に、クラスへの依存関係がコンストラクターを通じて自動的に挿入されることを意味します。

平たく言えば、現在クラスを操作しているが、このクラスの一部のメソッドまたは関数は、このクラスでは完了できないことを意味します。このクラスだけで実行できますが、別のクラスの助けを借りてのみ実現できます。

最も直接的な兆候は、パラメーター データがオブジェクトとして渡される場合です。厳密に言えば、あるクラスを別のクラスで操作したい場合、二つのクラスの間には相互依存関係があり、パラメータを渡す方法をインジェクションと呼びます

依存性インジェクションの理由

依存関係の注入は使用されません。PHP があるクラスで別のクラスを使用する必要がある場合、多くの場合、次の操作が実行されます。

たとえば、コンテナ クラスでアダプター クラスを使用する必要がある場合、これを行う必要があります。インスタンス化

多数の外部クラスを使用する必要がある場合、結合度が高くなりすぎて、後のメンテナンスが容易に困難になる可能性があります。

素人向けに外部クラスが機能するようになりますが、これは結合度が高すぎると呼ばれます

<?php
class container
{
    private $adapter;

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

単純な依存関係の注入

上記のコードは結合度が高すぎます。主に結合を理解するために、依存関係の挿入が出現します

次の場合、操作する必要があるクラス オブジェクトを渡すだけで済みます。

依存関係のパラメーターインジェクション操作はオブジェクトであり、通常のパラメータではありません。理解は深まりましたか?

しかし、このような単純な依存性インジェクションでは、多くのクラスに依存している場合、パラメータとパラメータを渡すのに長い時間がかかります。混乱しやすいでしょう

<?php
class container
{
    private $adapter;

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

高レベルの依存性注入

上記のパラメータの混乱の問題を解決するために、現時点では依存性注入が最適化されています。

魔法のメソッドを使用して、__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();

依存関係注入の適用

最初にコンテナ クラスを定義します。これは主に、操作したいクラスをコンテナに注入するために使用されます。

使用する場合は、コンテナのオブジェクトを渡すだけです

<?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); //我是调度器

依存関係注入の高次最適化

上記のアプリケーションでは、インスタンス化されたオブジェクトをコンテナに直接注入します

これにより、すべてのオブジェクトが使用される前にインスタンス化され、結果としてリソース損失

#オブジェクトを自分で使用する必要があるときにオブジェクトがインスタンス化されたり注入されたりしないように、クロージャを渡すことができます。インスタンス化するときに、サーバー リソースの損失を減らすことができます

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

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

(推奨チュートリアル:

PHP ビデオ チュートリアル )

以上がPHP における DI 依存関係の挿入を簡単に理解するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はjb51.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。