2016-08-03 19 views
0

私は単純な依存関係を「マッパー」にしようとしていますが、私はそれを依存インジェクタと呼ぶこともできません...ので、以下の概念を最小限にしようとしました。私は私の依存関係が別々に出てマッピングされているForeachループを使用した依存関係へのアクセス

class Container 
{ 
    public $dependencies = []; // an array of dependencies from the dependency file 

    public function __construct() 
    { 
     // include list of dependencies 
     include 'Dependencies.php'; 

     foreach ($dependency as $key => $value) { 
      $this->dependencies[$key] = $value; // e.g. dependency['A'] = ['B']; 
     } 
    } 

    /** 
    * gets the dependency to instantiate 
    */ 
    public function get($string) 
    { 

     if (isset($this->dependencies[$string])) { 

      $a = $string; 

      foreach ($this->dependencies[$string] as $dependency) { 

       $b = $dependency; 

       if (isset($this->dependencies[$dependency])) { 

        foreach ($this->dependencies[$dependency] as $dependency); 

        $c = $dependency; 

       } 

      } 

     } 

     $instance = new $a(new $b(new $c)); 
     return $instance; 

    } 
} 

私は、次のしている私のindex.phpページに

...私はこれを持っている私の単純なコンテナで

// >>> psr-4 autoloader here 

// instantiating the container 
$container = new Container; 

// getting an instance of 'A' with an object tree of A->B->C 
$a = $container->get('A'); 

...このようなファイル...

/** 
* to add a dependency, write the full namespace 
*/ 

$dependency['A'] = [ 
    'B' // A depends on B 
]; 

$dependency['B'] = [ 
    'C' // which depends on C 
]; 

そして、お互いに依存するクラスA、B、Cのセット...

class A 
{ 
    public function __construct(B $b) 
    { 
     echo 'Hello, I am A! <br>'; 
    } 
} 



class B 
{ 
    public function __construct(C $c) 
    { 
     echo 'Hello, I am B!<br>'; 
    } 
} 



class C 
{ 
    public function __construct() 
    { 
     echo 'Hello, I am C! <br>'; 
    } 
} 

私が動作するように何かを得るために、すべての午後を試してみましたが、私はどちらか、私はどのように作ることができ、私のget()機能で非常に明確に十分

質問

を考えておりません怖いですこれらの依存関係を自動的にロードすることで、私のget関数は決して終わりではないforeachifelseステートメント...何らかのコールバックを追加する必要がありますか?実際に私には明らかではない、と私は、私は非常にいくつかの異なるアプローチを試みてきたことを強調しなければならない。

+1

なぜクラス構造を設定して、オートワイヤリングではなくどこかに保存しています([こちら] [こちら](http://stackoverflow.com/questions/38702676/what-is-a-dependency-injection-container/38706152# 38706152))。リフレクションクラスでautowiringすることで、PHPは配列/ファイルから読み込むのではなく、依存関係を自動的に検出することができます。 – jeremy

答えて

1

あなたは間違っています。コンテナは、その依存関係構造体でのみ動作するように設計されています。たとえば、$container->get('B')は動作しません。$cはヌルになり、3番目にネストされたnewは失敗するため、$container->get('C')のいずれも失敗します。

コンテナをrecursiveの機能として作成することをお勧めします。

ところで、第3のものは何ですか。foreach?あなたは最後の依存関係を取得しようとしていますか?

私のarticleを読むことができます。

+0

この回答をありがとうございました...私はちょうど昨日再帰を見始めたと意味があります。私は慎重にあなたの記事とこの記事を読むつもりです... http://krasimirtsonev.com/blog/article/Dependency-Injection-in-PHP-example-how-to-DI-create-your-own-依存性注入容器 –

関連する問題