interface
Girl {
}
class
LoliGril implement Girl {
}
class
Vixen implement Girl {
}
class
Boy {
protected
$girl
;
public
function
__construct(Girl
$girl
) {
$this
->girl =
$girl
;
}
}
$loliGirl
=
new
LoliGirl();
$vixen
=
new
Vixen();
$boy
=
new
Boy(
$loliGirl
);
気分が良くないですか?私に誠実に接してくれる人に出会うたびに、私はこうやって自分を苦しめなければなりません。 。 。
少年
は言いました、私は強くなりたいです。何度も変えられたくない! 🎜それでは、
Boy
をもう少し強力にしてみましょう:
|
インターフェース 女の子 { 🎜
🎜 }🎜<divclass>🎜<divclass>class <code class="php plain">ロリグリル実装ガール {🎜
🎜 }コード >🎜<div class="linenumber8index7alt1">🎜<divclass><codeclass>クラス <code class="php plain">ビクセンimplement Girl { 🎜
🎜 }🎜<divclass>🎜<divclass index12 alt2><code class="php キーワード">クラス ボーイ { 🎜 protected $girl ; 🎜 🎜 <code class="php キーワード"> public function __construct(Girl $girl ) { 🎜
$ this ->girl = $girl ;🎜<div class="linenumber18 Index17 alt1">
<code class="php space"> } 🎜
} 🎜 🎜
$loliGirl = 新しい LoliGirl();🎜<div class="linenumber22index21alt1">
<code class="php variable">$vixen = 新しい Vixen(); 🎜 🎜 $boy = new 男の子 ( $loliGirl ); 🎜
$boy = new Boy( $vixen );
|
Boy
很高兴,终于可以不用扒开自己就可以体验不同的人生了。。。So Happy!
依赖注入方式
1、构造器 注入
1
2
3
4
5
6
7
8
|
<?php class Book {
private $db_conn ;
public function __construct( $db_conn ) {
$this ->db_conn = $db_conn ;
}
}
|
2、セッター注入
1
2
3
4
5
6
7 8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2 4
25
26
27
|
<?php <?php class Book {
private $db ;
private $file ;
function setdb( $db ) {
$this ->db = $db ;
}
function setfile( $file ) {
$this ->file = $file ;
}
}
class file {
}
class db {
}
class test {
$book = new Book();
クラス ブック { 🎜 🎜 プライベート $db ; 🎜🎜 private $file ; 🎜🎜 🎜🎜 関数 setdb( $db ) { 🎜🎜 $this ->db = $db ; 🎜🎜 } 🎜🎜 🎜 🎜 関数 setfile( $file ) { 🎜🎜 $this<code class="php plain">->file = $file ; 🎜🎜 } 🎜🎜 } 🎜🎜 🎜🎜クラス ファイル { 🎜🎜 } 🎜🎜 🎜🎜 クラス db { 🎜🎜 } 🎜🎜 🎜🎜🎜🎜 🎜🎜 class test { 🎜🎜 $book = new Book(); 🎜
$book ->setdb( new db());
$book ->setfile( new file());
}
|
概要:
ほとんどのアプリケーションは、ビジネス ロジックを実装するために相互に連携する 2 つ以上のクラスで構成されているため、各オブジェクトは連携するオブジェクト (つまり、そのオブジェクトが取得するオブジェクト) を取得する必要があります。と連携する) 依存オブジェクトへの参照)。この取得プロセスが単独で実装される場合、コードは高度に結合され、保守とデバッグが困難になります。
だからこそ、依存性注入の概念があるのです。依存性注入は次の問題を解決します:
上記 2 つのメソッドのコードは非常に複雑です。しかし、多くの依存関係を挿入する必要がある場合、多くの行を追加することになり、管理が難しくなります。
より良い解決策は、すべての依存関係のコンテナーとしてクラスを作成することです。このクラスでは、必要な依存関係を保存、作成、取得、検索できます。まずはIOC
制御の反転(IOC)の概念を理解しましょう
制御の反転は、コンピュータコード間の結合を減らすために使用できるオブジェクト指向プログラミングの設計原則です。最も一般的な方法は Dependency Injection (DI) と呼ばれ、もう 1 つは「Dependency Lookup」と呼ばれます。制御の反転により、オブジェクトが作成されると、システム内のすべてのオブジェクトを制御する外部エンティティが、依存するオブジェクトの参照をそれに渡します。依存関係がオブジェクトに注入されるとも言えます。
12345678910 11121314 |
<?php <?php
class Ioc {
protected $db_conn ;
public static function make_book() {
$new_book = new Book();
$new_book ->set_db(self:: $db_conn );
return $new_book ;
}
}
クラス Ioc {
|
protected
$db_conn
;
🎜🎜
public
static
関数
make_book() {
🎜🎜
コード> コード><code class="php 変数">$new_book
=
new
Book();🎜🎜
$new_book
->set_db(self::
$db_conn
);
🎜🎜
//...
🎜🎜
//...
🎜🎜
🎜🎜
return
$new_book
; code >🎜🎜<code class="php space">
}
🎜🎜
}
🎜🎜🎜 🎜🎜🎜
現時点でブックインスタンスを取得したい場合は $newone = Ioc::makebook(); を実行するだけです
上記はコンテナの特定のインスタンスです。特定のインスタンスを記述しないのが最善です。依存関係注入方法は、レジストリに登録して取得するのが良いです
11
12 13
14
15
16
17
18
19
20。
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
& lt;?php
コード>*/
クラス Ioc {
/**
*/
protected static $registry = 配列 code><code class="php plain">();
/**
*レジストリ配列に解決 (匿名関数) を追加します
|
<?php
class Ioc {
protected static $registry = array ();
* @param Closure $resolve インスタンスの作成に使用される匿名関数 🎜
public static function register( $name , Closure $resolve ) {
static :: $registry [ $name ] = $resolve ;
}
public static function resolve( $name ) {
if ( static ::registered( $name )) {
$name = static :: $registry [ $name ];
return $name ();
}
throw new Exception( "Nothing registered with that name" );
}
public static function registered( $name ) {
return array_key_exists ( $name , static :: $registry );
}
}
|
现在就可以通过如下方式来注册和注入一个
1 2 3 4 5 6 7 8 9 10 11 | <?php
Ioc::register( "book" , function () {
$book = new Book();
$book ->setdb( 'db' );
$book ->setfile( 'file' );
return $book ;
});
$book = Ioc::resolve( 'book' );
|
質問の概要
1. 参加者は誰ですか?
答え: 通常、3 つの関係者が関係し、1 つはオブジェクト、もう 1 つはオブジェクトの外部リソースです。名詞についてもう一度説明します。オブジェクトは通常の Java オブジェクトを指します。IoC/DI コンテナは、単に IoC/DI 機能を実装するために使用されるフレームワーク プログラムを指します。オブジェクトの外部リソースは必要ですが、取得されます。オブジェクトの外部からのリソースは、オブジェクトが必要とする他のオブジェクトや、オブジェクトが必要とするファイル リソースなど、総称してリソースと呼ばれます。
2. 依存: 誰が誰に依存しているか?なぜ依存関係があるのでしょうか?
答え: オブジェクトは IoC/DI コンテナに依存します。プロジェクトでは、さまざまなクラス間にさまざまな関係があり、すべてが完全に独立していることは不可能であり、依存関係が形成されます。従来の開発では、他のクラスを使用するときに直接呼び出しますが、これは強い結合を形成するため、避けるべきです。依存関係の注入では、コンテナーを借用して依存オブジェクトを転送し、分離を実現します。
3. 注射: 誰が誰に注射するのか?いったい何が注入されるのでしょうか?
答え: 必要な外部リソースをコンテナを通じてオブジェクトに注入します
4. 制御の反転: 誰が誰を制御するか?何を制御しますか?なぜ逆転と呼ばれるのでしょうか?
答え: IoC/DIコンテナコントロールオブジェクトは主にオブジェクトインスタンスの作成を制御します。反転は正の方向と相対的なものですが、何が正の方向とみなされるのでしょうか?通常の状況でアプリケーションを考えてみましょう。A の中で C を使用したい場合はどうしますか?もちろん、C のオブジェクトは直接作成されます。つまり、必要な外部リソース C がクラス A で能動的に取得されます。この状況を順方向と呼びます。では、逆とは何でしょうか?つまり、クラス A は積極的に C を取得するのではなく、IoC/DI コンテナが C のインスタンスを取得するのを受動的に待ち、それを逆にクラス A に注入します。
5. 依存関係の注入と制御の反転は同じ概念ですか?
答え: 上記からわかるように、依存関係の注入はアプリケーションの観点から完全に説明できます。アプリケーションは、必要な外部リソースの作成と注入、および反転をコンテナに依存します。コンテナの観点から説明は完了です。コンテナはアプリケーションを制御し、コンテナはアプリケーションに必要な外部リソースをアプリケーションに逆に注入します。