skillup

技術ブログ

アーキテクト設計全般

DIとDIコンテナについて再考

投稿日:2020年5月25日 更新日:

今までも何度かやったDI(Dependency Injection = 依存性の注入)について。

以前のリンク

PHPにおけるDI

スコープアノテーションとCDIについて

DIとはシンプルに言うと?

あるプログラムとあるプログラムを疎結合にしておき(切り離し)、外部から入力可能にしておくこと(これを注入などと言っています。)

だと解釈しています。

具体的に例をみていこうと思います。

サンプルコードと解説

Pet.php

Cat.php

Dog.php

Animal.php

上記の $animal = new Animal(new Dog('pochi'));の部分が依存性(AnimalはDogに依存しています)を注入していることになります。

プログラムをこのように書くことによってインスタンスの生成部分が仮にnew Cat(‘tama’) になってもAnimalには一切影響がありません。

もしこう言った考えがなく、Animalの中でDogやCatを生成していた場合、変更がききません。

DIコンテナとは?

上記のような非常に簡単な例だった場合はいいのですが、クラスが何十にもあった場合は、このような注入作業が大変になります。

Animalの引数がめちゃくちゃいっぱいになっちゃいますよね・・・・

この場合、Animalとサブクラス群(DogやCat)を結びつける専用の仕組みが必要になります。

それがDIコンテナと言われるものです。

サンプルコードと解説

PHPではpimpleと言うシンプルなDIコンテナが使えます。

https://pimple.symfony.com/

di_config.php

Animal.php

上記のようにプログラムを作っておくことで、変更があってもdi_config.phpのみに集中し、Animal.phpに変更が少ないないことが特徴です。

https://github.com/umanari145/phptips/tree/master/di/type2

参考リンク

DIとは?DIコンテナとは?試してみた(後編)[PHP][Pimple][DI]

DI・DIコンテナ、ちゃんと理解出来てる・・?

PHPでDIをやる(pimple)

-アーキテクト設計全般
-

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

関連記事

no image

アプリケーション間のデータの連携方法に関して

以前やった「現場で役立つシステム設計の原則」を再読してます。 今、読んでいるのはアプリ間のデータ連携に関して。 複数のアプリ間でデータをやり取りする場合、以下のような方法が考えられます。 ファイルを直 …

no image

APIに関して

RESTAPIのルーティングで気をつけることなんぞを。 直近のプロジェクトではRESTAPIを作ることが多かったんですが気をつけることなんぞを。 Contents1 仕様書はソースから2 ツール3 命 …

no image

オブジェクト指向設計 柔軟なインターフェイス

オブジェクト指向シリーズ。今回はインターフェイスについて。 インターフェイスといっても、implementsを使った実装だけではなく、要はあるクラスが外部の窓口となるときに使うメソッドってことだと思う …

no image

自動テストをやる上で今まで障害だったこと

自動テストについて、考え方自体は5年以上前から知っていましたが、プロジェクトで実際に使われているのを見たのは今年4月になってからでした・・・ 自動テスト完備なんて昔は夢物語だと思ってたんですけどね・・ …

no image

例外発生時で考えるべきポイント

いままでもいろいろ考えてきましたが、例外が発生した時のポイント(あるいはその周辺)について再度考えて見ようと思います。 Contents1 トランザクションスコープ2 どんな例外をなげるか3 例外を発 …

アーカイブ