php依存注入と制御反転の理解

3649 ワード

php依存注入と制御反転の2つの概念を理解するには,以下の問題を明らかにしなければならない.
DI―Dependency Injection依存注入
IoC――Inversion of Control制御反転
1、参加者は誰ですか.  
答え:一般的に3つの参加者がいて、1つはある対象です.一つはIoC/DIの容器です.もう1つは、オブジェクトの外部リソースです.また、あるオブジェクトは任意の、普通のJavaオブジェクトを指す.IoC/DIの容器の簡単な点は、IoC/DI機能を実現するためのフレームワークプログラムを指す.オブジェクトの外部リソースとは、オブジェクトに必要なものを指しますが、オブジェクトの外部から取得されたもので、オブジェクトに必要な他のオブジェクト、またはオブジェクトに必要なファイルリソースなど、リソースを総称します.
2、依存:誰が誰に依存しているのか.どうして頼りになるの?
A:あるオブジェクトはIoC/DIの容器に依存する.依存は避けられないが,1つのプロジェクトでは,各クラス間に様々な関係があり,すべてが完全に独立することは不可能であり,依存を形成している.従来の開発では,他のクラスを使用する場合に直接呼び出され,これは強い結合を形成し,これは回避される.依存注入は容器を借りて依存オブジェクトを移動してデカップリングを実現する.
3、注入:誰が誰に注入しますか?いったい何を注入しますか?
答え:コンテナを介してオブジェクトに必要な外部リソースを注入する
4、コントロールの反転:誰が誰をコントロールしますか?何をコントロールしますか?なぜ反転と呼ばれますか?
答え:IoC/DIのコンテナ制御オブジェクト、主に制御オブジェクトインスタンスの作成.反転は順方向に対して、何が順方向なのか.通常のアプリケーションを考えて、AでCを使うならどうしますか?もちろん、直接Cを作成するオブジェクト、すなわち、Aクラスで必要な外部リソースCをアクティブに取得することを順方向と呼ぶ.では、逆とは何でしょうか.すなわち,AクラスはCを自発的に取得するのではなく,受動的に待機し,IoC/DIのコンテナがCのインスタンスを取得するのを待ってから,Aクラスに逆注入する.
5、依存注入と制御反転は同じ概念ですか?
答え:上から見ることができます:依存注入はアプリケーションの角度から説明して、依存注入の説明を完全な点にすることができます:アプリケーションはコンテナに依存して作成してそれに必要な外部資源を注入します;一方、制御反転は、コンテナの観点から説明され、完全な点を説明します.コンテナ制御アプリケーションは、コンテナからアプリケーションに必要な外部リソースを逆方向に注入します. 
次に、依存注入のいくつかの実装方法を例に挙げて説明します.
1.コンストラクタ注入

db_conn = $db_conn;
  }
}

2、setter注入

db=$db;
   }
   function setfile($file){
     $this->file=$file;
   }
}
class file{}
class db{}
...

class test{
   $book = new Book();
    $book->setdb(new db()); 
   $book->setfile(new file());
}
?>


上記の2つのメソッドコードは明確ですが、多くの依存を注入する必要がある場合は、多くのローを増やす必要があり、管理が困難になります.
比較的良い解決策は、すべての依存関係としてclassを確立するcontainerであり、このclassで必要な依存関係を保存、作成、取得、検索することができる.

set_db(self::$db_conn);
    //...
    //...
    //       
    return $new_book;
  }
}

この場合、bookインスタンスを取得する場合は、$newone=Ioc::makebook();
以上はcontainerの具体的な例ですが、具体的な依存注入を方法として書かないほうがいいです.registry登録、get取得を採用したほうがいいです.

 
 

次のように登録して注入することができます

setdb('...');
$book->setprice('...');
return $book;
});
 
//    
$book = Ioc::resolve('book');
?>


以上がphp依存注入と制御反転の理解であり,PHPプログラム設計の学習に役立つことを期待する.