ホームページ  >  記事  >  バックエンド開発  >  PHPにおける依存性注入の原理

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

藏色散人
藏色散人オリジナル
2019-11-01 09:18:126103ブラウズ

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 サイトの他の関連記事を参照してください。

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