ホームページ  >  記事  >  バックエンド開発  >  PHPの依存性注入とは何ですか

PHPの依存性注入とは何ですか

王林
王林オリジナル
2019-09-23 13:14:183623ブラウズ

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)
  {
  }
}

This メソッド An最初のソリューションよりも改善された点は、クラス A をクラス B にバンドルする必要がありません。受信クラスがクラス A のニーズを満たす限り、クラス C、クラス D などにすることもできます。ただし、この解決策の欠点は、クラス A が多くのクラスに依存している場合、パラメーターのリストが非常に長くなり、混乱が発生しやすいことです。

3 番目のオプションは、次のコードに示すように、set メソッドを使用して

を渡すことです。

<?php
class A
{
  public function setB(B $b)
  {
    $this->b = $b;
  }
}

このオプションも存在し、 2 番目のオプション 同じ欠点は、依存クラスの数が増えると、非常に多くの set メソッドが必要になることです。現時点では、これらの依存関係の管理に役立つ特別なクラス (またはコンテナー) があれば素晴らしいだろうと考えていました。

依存性注入の簡単な例

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

<?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の依存性注入とは何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。