このライブラリを使用すると、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コンテナ
フェムト
シャーバット