PHPにおける依存性注入の原理

藏色散人
リリース: 2023-02-28 08:56:01
オリジナル
6191 人が閲覧しました

PHPにおける依存性注入の原理

#php 依存関係注入の原理

この記事の例では、PHP 依存関係注入の原理と使用法について説明します。 。参考のために皆さんと共有してください。詳細は次のとおりです:

はじめに

依存性注入とは何か知っていますか?

依存関係注入 (DI) の概念は奥が深いように思えますが、いくつかの新しい PHP フレームワークを使用したことがある場合は、すべて依存関係注入を使用してクラスを処理するため、DI についてよく理解しておく必要があります。

php で依存関係を渡すための 3 つのオプション

実際、DI を理解するには、まず php で依存関係を渡す方法を理解する必要があります。

最初の解決策であり、最も望ましくない解決策は、次のコードに示すように、クラス A で new キーワードを直接使用してクラス B を作成することです。

<?php
class A
{
  public function __construct()
  {
    $b = new B();
  }
}
ログイン後にコピー

なぜこの解決策なのかそれはお勧めできませんか?この場合、A と B が結合されているため、クラス A はクラス B なしでは動作できないことを意味します。

2 番目のオプションは、次のコードに示すように、クラス A のメソッドで必要なクラス B を渡すことです。

<?php
class A
{
  public function __construct(B $b)
  {
  }
}
ログイン後にコピー

このメソッドは、最初のオプションであるクラス A を改良したものです。クラス B とバンドルする必要はありません。受信クラスがクラス A のニーズを満たす限り、クラス C、クラス D などにすることもできます。

しかし、この解決策の欠点は、クラス A が多くのクラスに依存している場合、パラメーターのリストが非常に長くなり、混乱が容易に発生する可能性があることです。

3 番目の解決策は、次のコードに示すように、set メソッドを使用してそれを渡すことです:

<?php
class A
{
  public function setB(B $b)
  {
    $this->b = $b;
  }
}
ログイン後にコピー

この解決策にも 2 番目の解決策と同じ欠点があります。依存クラスが増えると、たくさんのsetメソッドが必要になります。

現時点では、これらの依存関係の管理に役立つ特別なクラス (またはコンテナー) があればいいのに、と考えていました。

依存関係注入の簡単な例

次のコードは twitter からのものです:

<?php
class Container {
 private $s=array();
 function __set($k, $c) { $this->s[$k]=$c; }
 function __get($k) { return $this->s[$k]($this); }
}
ログイン後にコピー

コンテナ クラスを使用して、A と B の間の依存関係をどのように管理できますか?コード内で話します:

<?php
class A
{
  private $container;
  public function __construct(Container $container)
  {
    $this->container = $container;
  }
  public function doSomeThing()
  {
    //do something which needs class B
    $b = $this->container->getB();
    //to do
  }
}
ログイン後にコピー

次に、クラス B をコンテナ クラスに挿入します:

$c = new Container();
$c->setB(new B());
ログイン後にコピー

また、匿名関数を渡すことで、クラス B が渡されたときにインスタンス化されないようにすることもできます。

$c = new Container();
$c->setB(function (){
  return new B();
});
ログイン後にコピー

これは非常に単純な例ですが、実際には、遅延読み込みなど、コンテナ クラスについて考慮すべきことがたくさんあります。

PHP 関連の知識の詳細については、

PHP 中国語 Web サイト をご覧ください。

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

関連ラベル:
php
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート