私はDI
とIoC
を頭に浮かべています。今のところPimpleを使用しています。私は新しいオブジェクトがIoC
を意識せずにインスタンス化されますが、それでも私は再利用したいと思いますcall_user_func_array
IoCコンテナを渡す適切な方法
//$class = 'Dog', $method = 'woof', $this->args = ['foo', 'bar']
call_user_func_array(array(new $class, $method), $this->args);
ことを早期に実行フロー
$container = new Injection\Container();
$container['config'] = function ($c) {
return new Config($c['loader']);
};
$container['request'] = function ($c) {
return new Request($c['config']);
};
...
とルータクラスで私のIoCを定義したとしましょういくつかのサービスが定義されています。
- クラス(静的は悪のようです...)または
- に
IoC
を渡すために適切な方法で合格することが必要でさえですがどうなるか:私の質問があるclass Dog { public function woof($var1, $var2) { //$request = IoC service here } }
周囲の容器や他の方法/概念が存在するか?
しかし
をそれを把握することができませんでした、いくつかの素晴らしい記事を読む更新
悪方法I少なくとも有害な方法を使用することを決めたが
Update 2の静的プロパティでIoC
$container['services'] = function ($c) {
return Services::create($c); //make the service
};
$container['services']; //call the service
以降
class Dog
{
public function woof($var1, $var2)
{
$services = new Services();
$request = $services['request']; //retrieving the request service
}
}
でのアクセス、それを保存し、別のサービスを定義していた //passing the container here
call_user_func_array(array(new $class($container), $method), $this->args);
そして__constructor
public $container;
public function __construct(Injection\Container $container)
{
$this->container = $container;
}
//passing the container here
call_user_func_array(array(new $class($container), $method), $this->args);
__constructor
public $container;
public function __construct(Injection\Container $container)
{
$this->container = $container;
}
ありがとうございます。また、「DIでは、そのクラスがコンポジションルートの一部でない限り、コンテナをクラスに渡すことはありません。と "DIでは、クラスの依存関係は明示的なので、コンストラクタのパラメータよりも見た目を変える必要はありません。"私の場合に適用されます。しかし、クラスが未知のサービスに依存している場合はどうでしょうか?セッター注入? – sitilge
'クラスがまだ不明なサービスに依存する場合はどうすればよいですか? ' - IoCの使用法は*具体的な型ではなく*抽象クラス*へのプログラミングです。これは多くの点で役立ちますが、主に未知の具体的なクラスをコードを変更せずにプラグインする方法を提供することができます。また、テスト用のモックを作成することもできます。クラスが抽象規約(通常はインターフェース)に準拠している限り、これは可能です。私はスニペットを提供したいと思いますが、私はPHPに慣れていません... – NightOwl888
ありがとうございますが、 'call_user_func_array'を使用しているので、これは問題を解決しません。 – sitilge