ホームページ  >  記事  >  バックエンド開発  >  PHP 依存関係反転 (Dependency Injection) コード例、依存関係反転の原則_PHP チュートリアル

PHP 依存関係反転 (Dependency Injection) コード例、依存関係反転の原則_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-13 10:17:30863ブラウズ

PHP 依存関係反転 (Dependency Injection) コード例、依存関係反転原理

実装クラス:

コードをコピーします コードは次のとおりです:


クラスコンテナ
{
保護された $settings = array();

パブリック関数セット($abstract, $concrete = null)
{
if ($concrete === null) {
$concrete = $abstract;
}

$this->settings[$abstract] = $concrete;
}

パブリック関数 get($abstract, $parameters = array())
{
If (!isset($this->settings[$abstract])) {
null を返す;
}

return $this->build($this->settings[$abstract], $parameters);
}

パブリック関数 build($concrete, $parameters)
{
if ($concrete instanceof Closure) {
return $concrete($this, $parameters);
}

$reflector = new ReflectionClass($concrete);

If (!$reflector->isInstantiable()) {
throw new Exception("クラス {$concrete} はインスタンス化できません");
}

$constructor = $reflector->getConstructor();

if (is_null($constructor)) {
return $reflector->newInstance();
}

$parameters = $constructor->getParameters();
$dependency = $this->getDependency($parameters);

return $reflector->newInstanceArgs($dependency);
}

パブリック関数 getDependency($parameters)
{
$dependency = array();
foreach ($parameters として $parameters) {
$dependency = $parameter->getClass();
if ($dependency === null) {
If ($parameter->isDefaultValueAvailable()) {
$dependency[] = $parameter->getDefaultValue();
} else {
throw new Exception("クラスの依存関係 {$parameter->name} を解決できません");
}
} else {
$dependency[] = $this->get($dependency->name);
}
}

$dependency を返します;
}
}

実装例:

コードをコピーします コードは次のとおりです:


'container.php' が必要です;


インターフェース MyInterface{}
クラス Foo は MyInterface を実装します{}
クラス Bar は MyInterface を実装します{}
バズクラス
{
パブリック関数 __construct(MyInterface $foo)
{
$this->foo = $foo;
}
}

$container = 新しいコンテナ();
$container->set('Baz', 'Baz');
$container->set('MyInterface', 'Foo');
$baz = $container->get('Baz');
print_r($baz);
$container->set('MyInterface', 'Bar');
$baz = $container->get('Baz');
print_r($baz);

依存性注入とはなぜですか

依存性注入と制御の反転は同義語であり、統合されました。制御の反転 (IoC) は、コンピュータ プログラムの結合問題を軽減するための重要なオブジェクト指向プログラミング原理です。 制御の反転は依存性注入(Dependency Injection)とも呼ばれます。略してDI。
原点
2004 年にマーティン・ファウラーは「制御のどのような側面が逆転しましたか?」という質問をしました。彼は、依存オブジェクトの取得が逆転されたと結論付けました。この結論に基づいて、彼は制御の反転をより適切な名前として「依存性注入」を考案しました。多くの特別なアプリケーション (HelloWorld.java よりもエレガントで複雑) は、ビジネス ロジックを実装するために相互に連携する 2 つ以上のクラスで構成されます。そのため、各オブジェクトには、連携するオブジェクト (つまり、依存するオブジェクト)。このフェッチ プロセスを単独で実装すると、ご覧のとおり、コードが高度に結合され、テストが困難になります。 IoC は、「依存性反転原則」としても知られています。ほとんどすべてのフレームワークは、IoC 原則の応用とも言える「逆注入 (Fowler 2004)」技術を使用しています。SmallTalk、C++、Java、またはさまざまな .NET 言語などのオブジェクト指向プログラミング言語のプログラマは、制御の反転は Spring フレームワークの核心であり、オブジェクトが作成されると、そのオブジェクトが依存するオブジェクトの参照が、システム内のすべてのオブジェクトを制御する外部エンティティによって渡されます。したがって、制御の反転とは、オブジェクトが依存するオブジェクトへの参照を取得する方法に対する責任の反転です。 IoC は設計パターンです
IoC は、GoF と同様に、テクノロジーではありません。インターフェイス駆動設計には、さまざまな柔軟なサブクラス実装が提供され、コードの安定性と堅牢性が向上するなど、多くの利点がありますが、遅かれ早かれ次のようなインターフェイスを実装する必要があります。 a = new AInterfaceImp(); このようにして、次のような結合関係が生成されます。 クラス A AInterfaceImp との依存関係があります。AInterface の別の実装を使用する場合は、当然ながらコードを変更する必要があります。条件に基づいて AInterface の目的の特定の実装を生成するためのファクトリを構築できます。つまり、次のようになります。 InterfaceImplFactory { AInterface create(Objectcondition) { if (condition = condA) { しかし、本質的には、このコードの結合は変更されていません。 IoC モデルによって完全に解決されます。IoC モデルは、結合をコードから取り出して統合 XML ファイルに置き、必要に応じてコンテナーを通じてこの依存関係を形成します。つまり、必要なインターフェイスの実装を、それを必要とするクラスに挿入します。 . これが「依存性注入」という用語の由来と考えられます。 IOC モードでは、IOC モードを実装する IOC コンテナがシステムに導入され、IOC コンテナはオブジェクトのライフサイクルや依存関係などを管理できるため、アプリケーションの構成や... 続きは全文>>

面接の質問: どのような技術 Web サイトによくアクセスしますか? c#net にはどのような技術 Web サイトとオープン ソース プロジェクトがありますか?

国内cnblog 51cto csdn

海外
www.asp.net
www.codeproject.com
www.codeplex.com

オープンソースプロジェクトに関しては、51aspxはどうやって有名なNunit、Json.net、log4net、luceneを入手できますか? .net、paint.net、mono はたくさんあります。以下のリストをご覧ください

1. [テスト] xUnit.net - TDD に最適なテスト フレームワークの 1 つ。
2.[テスト] RhinoMocks モック フレームワーク - モックを作成してテストを簡単にします。
3.[テスト] Windows アプリケーションの自動化用の白 - コードを使用して、テスト用に Windows プログラムを駆動します。
4.[テスト] Gallio オートメーション プラットフォーム - MSTest、xUnit、NUnit、MbUnit などの多くのテスト フレームワークを実行できます。
5.[データ] Fluent NHibernate - Fluent NHibernate を使用すると、C# コードを使用してマッピング関係を設定できます。
6.[OOP] StructureMap の依存関係の挿入/制御の反転 - クラスと依存関係を分離します。
7.[OOP] マネージド拡張性フレームワーク - 静的コンパイラーから動的言語プログラムへの変換
8.[APPFX] Web アプリケーション用の s#arp アーキテクチャ - ASP.NET MVC および NHibernate を使用して Web アプリケーションを迅速に開発します。
9.[APPFX] Web アプリケーションを構築するための OpenRasta REST ベースのフレームワーク - プログラムに REST API インターフェイスを持たせます。
10.[APPFX] CSLA.NET Application Framework - .NET 開発のための包括的なフレームワーク
11.[APPFX] Spring.NET Application Framework - Web 開発のための包括的なフレームワーク
12.[RUNTIME] Mono は Linux および Mac で .NET を可能にします - Linux、BSD、および .NET を使用する OS X で
13.[UTIL] Sandcastle ヘルプ ファイル ビルダー - MSDN スタイルのドキュメントを作成します。
14.[ヘルパー] Windows API フック用 EasyHook - アンマネージ コードをマネージ コードで拡張します。
15.[HELPER] JSON 形式のデータを操作するための Json.NET - 1 つのステートメントで .NET オブジェクトをシリアル化します。
16.[ヘルパー] Excel 97 ~ 2007 用 Excel データ リーダー - ...残りの全文>>


http://www.bkjia.com/PHPjc/892260.html

tru​​ehttp://www.bkjia.com/PHPjc/892260.html技術記事 PHP 依存関係反転 (Dependency Injection) コード例、依存関係反転原則の実装クラス: 次のようにコードをコピーします。 php class Container { protected $settings = array();
;
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。