依存性注入
依存性注入は派手な用語ですが、実際には、クラスの依存関係がコンストラクター、場合によっては「セッター」メソッドを通じて「注入」されることを意味します。まず、Laravel コントローラーのコード例を見てみましょう:
<?php namespace App\Http\Controllers; use Illuminate\Routing\Controller; use App\Users\Repository as UserRepository; class UserController extends Controller { /** * 用户 Repository 的实例。 */ protected $users; /** * 创建一个新的控制器实例。 * * @param UserRepository $users * @return void */ public function __construct(UserRepository $users) { $this->users = $users; } /** * 显示指定 ID 的用户。 * * @param int $id * @return View */ public function show($id) { $user_info = $this->users->find($id); return view('user', ['user_info' => $user_info]); } }
Laravel はクラスの依存関係を管理し、サービス コンテナーを通じて依存関係の注入を実行します。インターフェイスを関数パラメーターの型ヒントとして使用する場合は、指定された実装をインターフェイスにバインドする必要があります。
これは、いわゆるインターフェイス指向プログラミングです。インターフェイスは、仕様と制約として理解できます。高レベルのモジュールは低レベルのモジュールに直接依存せず、すべて抽象化 (インターフェイスと呼ばれる) に依存する必要があります。依存関係注入を使用する最も重要な利点は、オブジェクトとそれに必要な外部リソースが効果的に分離され、それらが疎結合になり、関数の再利用が容易になることです。さらに重要なのは、プログラムのアーキテクチャ全体が非常に柔軟になることです。 。 制御の反転制御の反転 (Inversion of Control、略称 IoC) は、オブジェクト指向プログラミングにおける設計原則です。最も一般的な方法は依存性注入 (DI) と呼ばれ、もう 1 つの方法は「依存性ルックアップ」と呼ばれます。制御の反転により、オブジェクトが作成されると、システム内のすべてのオブジェクトを制御する外部エンティティが、依存するオブジェクトの参照をそれに渡します。依存関係がオブジェクトに注入されるとも言えます。interface EventPusher { public function send($data); }
IoC/DI コンテナがある場合、以下の図に示すように、クラス A は積極的に C を作成しなくなりました:
代わりに、IoC/DI コンテナが C を取得するのを受動的に待ちます。以下の図に示すように、インスタンスを作成し、それをクラス A に逆注入します。