PHPのIoC

Inversion of Control(IoC)コンテナは、Javaの世界で広く使用されている依存性注入を整理する便利な方法です。

このライブラリを使用すると、PHPでIoCコンテナーを使用できます。



たとえば、いくつかのインターフェイスについて説明します。

interface First { public function first(); } interface Second { public function second(); } interface Third { public function third(); } 


そしてそれらの実装:

 class Foo implements First { public function first() { /* ... */ } } class Boo implements Second { public function __construct(First $first) { /* ... */ } public function second() { /* ... */ } } class Woo implements Third { public function __construct(First $first, Second $first) { /* ... */ } public function third() { /* ... */ } } 


次に、IoCコンテナーを使用して依存関係を説明します。

 $ioc = IoC\Container::getInstance(); $ioc->register('Foo'); $ioc->register('Boo'); $ioc->register('Woo'); 


依存関係は自動的に割り当てられます。 FooクラスはFirstインターフェースを実装します。IoCコンテナーでは、FirstはFooを指します。

これらのインターフェイスに応じてマネージャークラスを説明します。

 class Manager { use IoC\Creatable; public function __construct(First $first, Second $second, Third $third) { /* ... */ } } 


マネージャーのインスタンスを作成します。

 $manager = Manager::create(); 


IoCは、マネージャーのコンストラクターに必要なクラスをインスタンス化します。

PHP 5.4がない場合、不純物は使用できません。

 class Manager { public static function create() { return \IoC\Factory::create(get_called_class(), func_get_args()); } /* ... */ } 


また、マネージャーのコンストラクターで、追加のパラメーターを記述することができます。

 class Manager { use IoC\Creatable; public function __construct(First $first, Second $second, Third $third, $value, $anotherValue = 'default') { /* ... */ } } 


そして引き続きIoCを使用します:

 $manager = Manager::create('value', 'another value'); $managerWithDefault = Manager::create('value'); 


このライブラリは、Reference、Lazy、Prototypeの3種類の依存関係を実装しています。

遅延読み込み:
 $ioc->register('Foo'); 

Fooクラスのインスタンスは、create()関数が呼び出されたときにのみ作成されます

この場合、Fooクラスの1つのインスタンスがどこでも使用されます。
 $ioc->register(new Foo()); 


クラスがプロトタイプテンプレートに基づいて構築されている場合(クローンを使用して新しいオブジェクトが作成される場合)、次の関数が役立ちます。
 $ioc->prototype(new Foo()); 

create()が呼び出されるたびに、クローンを使用して新しいFooインスタンスが作成されます。

独自の関連付けを追加することもできます。
 $ioc->assoc(new MyAssoc('Foo')); 


IoCでは、インターフェイスの実装を手動で構成できます。

 $ioc->register('Foo', 'First'); $ioc->register(new Foo(), 'Second'); $ioc->prototype('Foo', 'First'); 


複数の関連付け。 FooBooクラスが2つのFirst、Secondインターフェイスを一度に実装する場合:

 $ioc->register('FooBoo', array('First', 'Second')); 


クラスの関連付けを追加することもできます。

 //  Boo extends Foo $ioc->register('Boo', 'Foo'); 


GitHubプロジェクト

PHPの他のIoC実装

PHPポートPicoコンテナ
フェムト
シャーバット

Source: https://habr.com/ru/post/J132084/


All Articles