#はじめに
依存性注入とは何かご存知ですか?依存関係注入 (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 中国語 Web サイトの他の関連記事を参照してください。