skillup

技術ブログ

プログラミング全般

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

投稿日:

今までも何度かやった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

ファジープロジェクト対策 その1

5月ぐらいから着手していたプロジェクト(顧客管理ソフト)が終焉を迎え、検証段階に入ったので、記して置きたいことなど。 数ヶ月程度ですが、自分が携わったプロジェクトの中では過去最大クラスのものでした。 …

no image

オブジェクト指向 プレゼンテーション層

本日も引き続き「現場で役立つシステム設計の原則」を読み進めてます。 本日はプレゼンテーション層、いわゆるMVCのViewにあたる部分。 Contents1 プレゼンテーション層の考え方1.1 要点1. …

no image

エラーレポーティングサービス Sentryについて

リリースした後、運用段階に入ると定期的にバグ報告が上がってきます。 本来はリリース前に研修テストをすべきなんですが、そんな余裕ないことも多い(汗) で、そんな時に大事なのが エラーを気づけること 対処 …

no image

1度に1つのことを

今回のリーダブルコードの概念はやや抽象的。 要は一度に行うタスクは1つにする、というところがポイントになります。 そのための手法として下記のようなことを上げています。 コードが行っているタスクをすべて …

no image

気をつけたいトリガー系の処理など

実務でひやっとすることがあり、自分への戒めも込めてメモします。 Contents1 MySQLのcurrent_timestamp on update current_timestamp2 Larav …