依存性の注入(Dependency Injection, DI)は、クラスが依存関係を自ら作成するのではなく、外部(通常はコンストラクタ経由)から受け取る設計パターンです。モダンなPHPフレームワークはDIを多用し、多くの場合コンテナを使用して依存関係を自動的に解決し注入します — これにより疎結合でテスト可能なコードが実現します。
DIが解決する問題
{
;
{
->mailer = ();
}
}
{
{}
}
依存関係を注入する(インターフェースに対して)ことで、クラスは具体的な実装から切り離されます — 実装を切り替えることができ、テストではモックを注入できます。
class OrderService {
public function __construct(
private OrderRepository $repo, // dependencies declared in the constructor
private MailerInterface $mailer,
private LoggerInterface $logger,
) {}
}
コンストラクタ注入は依存関係を明示的にし、オブジェクト作成時に完全に形成されることを保証します。
// a DI CONTAINER builds objects, resolving the whole dependency graph automatically
$container->bind(MailerInterface::class, SmtpMailer::class); // map interface → impl
$service = $container->get(OrderService::class);
// the container sees OrderService needs OrderRepository, MailerInterface, LoggerInterface,
// constructs each (recursively), and injects them — you don't `new` anything manually
DIコンテナ(Laravel、Symfony、またはPHP-DIなどのスタンドアロン)は、コンストラクタの依存関係を再帰的に解決してオブジェクトを自動的に構築します — インターフェースから実装へのバインディングを設定すると、コンテナがすべての配線を自動的に行います。
✓ Loose coupling — depend on interfaces/abstractions, not concrete classes
✓ Testability — inject mocks/fakes in tests (no real DB/mailer needed)
✓ Flexibility — swap implementations via container config (e.g. fake mailer in dev)
✓ Single responsibility — classes focus on logic, not constructing dependencies
依存性の注入はモダンPHPの基本的なパターンであり、プロフェッショナルなアプリケーションとフレームワーク(Laravel、Symfony)の構造の中核です。これを理解することはシニアレベルの重要な知識です。
中核的な価値は疎結合性とテスト可能性です。クラスが自ら依存関係を作成するのではなく、(インターフェースに対して宣言された)依存関係を受け取ることにより、コードは疎結合になり(具体的な実装ではなく抽象化に依存)、簡単にテスト可能になり(実際のデータベースやサービスの代わりにモックを注入できるため、徹底的なユニットテストが実用的になります)、柔軟になります(設定を通じて実装を切り替えることができます)。
モダンPHPフレームワークはDIコンテナを提供し、これにより自動化されます — インターフェースから実装へのバインディングに基づいて依存関係グラフ全体を自動的に解決し注入するため、オブジェクトを手動で構築する必要はありません。
コンストラクタ注入(標準的な形式)、インターフェースに対するプログラミング、DIコンテナがどのように機能するか(自動解決)を理解することは、PHPフレームワークと効果的に連携するために(フレームワークはDIの周りに構築されています)、また整理された、保守可能でテスト可能なコードを書くために不可欠です。
DIはすべての主要なモダンPHPフレームワークの構造の基礎であり、プロフェッショナルなアプリケーション設計の特徴であるため、習得すること — パターン、その利点、コンテナベースの解決を理解すること — は、整理された、テスト可能なフレームワーク的なPHPを構築できる開発者とタイトに結合された、テストが難しいコードを書く開発者を区別する重要な知識です。
ジュニアからシニアまで、詳細な回答付きのIT面接質問ライブラリ。
寄付する