2015-09-29 14 views
7

PHPで依存関係注入を理解しようとしています.Laravelでこれを行うには2つの方法があります。phpのこれら2つのタイプのコンストラクタインジェクションの違いは何ですか?

class Foo{ 

} 

I持っているので、私のような何かができるFooに依存しているBarというクラス:

class Bar{ 
    protected $foo; 
    public function __construct() 
    { 
     $this->foo = new Foo(); 
    } 
} 

しかし

だから、私たちは、私はそうのようなクラスFooを持っているとしましょうララヴェルでは、タイプヒントやリフレクションのような言葉が出てきました。

class Bar{ 
    protected $foo; 
    public function __construct(Foo $foo) 
    { 
     $this->foo = $foo; 
    } 
} 

私が理解しようとしているのは、これら2つの違いです。彼らは全く同じですか?そして、私が他の人よりも好むべき特別な理由はありますか?

PS:私は初心者です。質問で専門用語を正しく使用しているかどうかはわかりません。

+9

最初の例は、FooをBarに偽装することができないため、テストするのが非常に難しいです。 2番目はDependency Injection(DI)と呼ばれ、Bar –

+3

の可能性のある重複をテストしているときにFooを模擬することができます(依存性注入とは何ですか?)(http://stackoverflow.com/questions/130794/what-is-依存関係注入) – Gal

+5

2つめは、Fooが実際にFooインスタンスになる必要もなくなりますが、FooまたはFooを拡張するクラスのインスタンス(型ヒントがそれを強制する)のいずれかになります.... loose couplingあなたがもはや実際のFooに拘束されていないからです。 –

答えて

1

コードのカップリングになる場合がほとんどです。

class Foo { 
    public function __construct() { 
     new Bar; 
    } 
} 

この特定FooBar非常に具体的なこのカップル。 を変更する方法はありません。このコードを書き換えずにBarがインスタンス化されます。これはまた、Fooが約Barの依存関係について知っておく必要があることを意味します。多分今日Barはただnew Barでインスタンス化することができます。しかし、明日はBarをリファクタリングしており、new Bar($database)でインスタンス化する必要があります。これに対応するために、Fooも書き直す必要があります。

依存性の注入は、(上記ない依存性注入である、あなたは何かを注入していない)の出番だ:

class Foo { 
    public function __construct(Bar $bar) { } 
} 

このFooは単にそれがの特性を持つオブジェクトを必要としていることを宣言しますインスタンス化時にBar。しかし、Fooは、Barがどのように近づいて来たのか、その依存関係が何であるか、正確には何かについて知る必要はありません。 Barの唯一のものは、定義されたpublicインターフェイスです。それに関する他のものは無関係です。実際、さらに柔軟性を得るために、具体的なクラス依存関係の代わりにinterfaceを使用することもできます。

依存性注入を使用すると、クラスの具体的な詳細を他のコードから離婚させることができます。クラスをインスタンス化する中心的な場所を1つ持つことができます。これは、インスタンス化しているクラスに関する具体的な詳細を知り、検討する必要がある場所です。これは例えば依存性注入コンテナとすることができる。上で述べたように、ロジックが変わる可能性があり、そのあちこちにコードを書き直す必要があるため、クラスのインスタンス化ロジックを全面に広げたくありません。それはBarFooに注入されますが決定されるのWHERE

require_once 'Foo.php'; 
require_once 'Bar.php'; 

$foo = new Foo(new Bar); 

上記のコードです。それはまた、Barの依存関係を心配する必要がある場所です。依存関係のロードとインスタンス化は、このコードが行う唯一のことであることに注意してください。 FooまたはBarに触れることなく、必要に応じてこのコードだけを変更するのは簡単です。これは複雑なビジネスロジックでいっぱいです。

依存性注入コードでは、アプリケーションを分けて柔軟に組み合わせることもできます。例えば、テスト目的のため。あるいは、さまざまなコンテキストで柔軟に異なるコンポーネントを再利用するだけです。

How Not To Kill Your Testability Using Staticsも参照してください。

+0

この詳細な回答をありがとうございました。それは有り難いです。 :) – Rohan

関連する問題