---
title: DIコンテナとAutowireの「魔法」を実装して理解する
tags:  #php #phperkaigi2026  
author: [takaram](https://image.docswell.com/user/takaram)
site: [Docswell](https://www.docswell.com/)
thumbnail: https://bcdn.docswell.com/page/9J29Y6VWER.jpg?width=480
description: PHPerKaigi 2026の発表資料です。 デモで利用するソースコードのリポジトリはこちら： https://github.com/takaram/simple-di-container
published: March 22, 26
canonical: https://image.docswell.com/s/takaram/5Q28XV-phperkaigi-2026-di-container
---
# Page. 1

![Page Image](https://bcdn.docswell.com/page/9J29Y6VWER.jpg)

DIコンテナとAutowireの「魔法」
を実装して理解する
PHPerKaigi 2026
荒巻拓哉 (@takaram71)


# Page. 2

![Page Image](https://bcdn.docswell.com/page/DEY4G939JM.jpg)

本発表の資料
スライド
デモ用ソースコード


# Page. 3

![Page Image](https://bcdn.docswell.com/page/VJNYGLVD78.jpg)

自己紹介
● 荒巻拓哉
● X: @takaram71
GitHub: @takaram
● バックエンドエンジニア @株式会社
ラクス
○ 問い合わせ自動応対システムの
開発


# Page. 4

![Page Image](https://bcdn.docswell.com/page/YE9PW468J3.jpg)

今日のテーマ
● DI・DIコンテナ
○ “型宣言を書いとけば勝手に代入されてるやつ”？
今日のゴール
● DIコンテナが何をしてるのかイメージできる


# Page. 5

![Page Image](https://bcdn.docswell.com/page/GE8DNQZZED.jpg)

DI / DIコンテナとは？


# Page. 6

![Page Image](https://bcdn.docswell.com/page/LELMPXD17R.jpg)

DIとは
Dependency Injection
● クラスAからクラスBのメソッドを呼び出す
○ クラスB = 依存 dependency
● Dependencyを外から渡してもらう = injection
● クラス自身がdependencyをnewしない
○ テストではモックに差し替えたりできる


# Page. 7

![Page Image](https://bcdn.docswell.com/page/4JMY4LP5JW.jpg)

DIしないパターン


# Page. 8

![Page Image](https://bcdn.docswell.com/page/PJR9WK1Z79.jpg)

DIするパターン
コンストラクタインジェクション: newの引数に渡す


# Page. 9

![Page Image](https://bcdn.docswell.com/page/PEXQPLY1JX.jpg)

DIするパターン
セッターインジェクション: setterメソッド経由で渡す


# Page. 10

![Page Image](https://bcdn.docswell.com/page/3EK9DL3MED.jpg)

DIするパターン
プロパティインジェクション: プロパティに 何らかの方法で 直
接セットする


# Page. 11

![Page Image](https://bcdn.docswell.com/page/L73WR3G275.jpg)

DIするパターン
● よく使うのはコンストラクタインジェクション
○ 未設定状態にならない
○ 特殊な操作が不要


# Page. 12

![Page Image](https://bcdn.docswell.com/page/87DKY416JG.jpg)

DIを使った実装
● 大量にnewが必要
● コンストラクタ引数変更が
大変


# Page. 13

![Page Image](https://bcdn.docswell.com/page/VJPK6M5ZE8.jpg)

DIコンテナの役割
● オブジェクト生成を担う


# Page. 14

![Page Image](https://bcdn.docswell.com/page/2EVV39PMEQ.jpg)

DIコンテナはオブジェクト生成方法をどう知る？
● 人間が事前に設定する
● DIコンテナ自身が型宣言から判断してくれる
○ → Autowire


# Page. 15

![Page Image](https://bcdn.docswell.com/page/57GL3ZPXEL.jpg)

DIコンテナライブラリ
● 多くのフレームワークはDIコンテナが組み込まれている
● 専用のDIコンテナライブラリもある


# Page. 16

![Page Image](https://bcdn.docswell.com/page/4EQY5L25JP.jpg)

ここまでのまとめ
● DI: 利用するオブジェクトを外から渡すこと
● DIコンテナ: 渡すべきオブジェクト（依存）の用意～オブジェ
クト生成までしてくれるもの
● Autowire: 依存を型宣言から自動判断してくれる機能


# Page. 17

![Page Image](https://bcdn.docswell.com/page/KJ4W9DLV71.jpg)

DIコンテナのAutowireを作る


# Page. 18

![Page Image](https://bcdn.docswell.com/page/LE1YKZL47G.jpg)

今回作るDIコンテナの機能
● クラス名からインスタンスを取得できる
● コンストラクタの引数を自動で解決できる (Autowire)
● インターフェースと実装クラスを紐づけられる


# Page. 19

![Page Image](https://bcdn.docswell.com/page/GEWGD9VZJ2.jpg)

Step 1: クラス名からインスタンスを取得


# Page. 20

![Page Image](https://bcdn.docswell.com/page/47ZLG94LJ3.jpg)

Step 2: コンストラクタの引数を自動で解決
● 型宣言を取得するためにリフレクションを利用
● リフレクション
○ PHPの標準機能
○ クラス、メソッド、関数、etc. の様々な情報を取得できる


# Page. 21

![Page Image](https://bcdn.docswell.com/page/YJ6WYK3MJV.jpg)

Step 2: コンストラクタの引数を自動で解決


# Page. 22

![Page Image](https://bcdn.docswell.com/page/GJ5MGPLQJ4.jpg)

Step 3: インターフェースと実装クラスを紐づけ
● 紐づけの設定方法はライブラリによってバラバラ
● 今回はnew Container()の引数に渡す方式


# Page. 23

![Page Image](https://bcdn.docswell.com/page/LE3WR3LZE5.jpg)

Step 3: インターフェースと実装クラスを紐づけ


# Page. 24

![Page Image](https://bcdn.docswell.com/page/8EDKY4N47G.jpg)

今回作るDIコンテナの機能
● クラス名からインスタンスを取得できる
● コンストラクタの引数を自動で解決できる (Autowire)
● インターフェースと実装クラスを紐づけられる
→ 意外とシンプルなコードで実装できた！🎉


# Page. 25

![Page Image](https://bcdn.docswell.com/page/V7PK6M5VJ8.jpg)

未対応の機能
● 異常系の処理
○ 循環依存
○ 存在しないクラス、未紐づけのインターフェース
● スカラー引数対応
● (セッター|プロパティ)インジェクション
● シングルトン管理
etc.


# Page. 26

![Page Image](https://bcdn.docswell.com/page/2JVV39PRJQ.jpg)

まとめ
● DIコンテナの本質的な部分は意外とシンプル
● リフレクションを利用すると、クラスやメソッドの情報を取れ
る
● ブラックボックスなDIコンテナの中をイメージできていれば
幸いです！


# Page. 27

![Page Image](https://bcdn.docswell.com/page/5EGL3ZP6JL.jpg)

付録


# Page. 28

![Page Image](https://bcdn.docswell.com/page/4JQY5L227P.jpg)

もう1つのインスタンス作成方法
● new $className(...$args)以外に、リフレクションに
もインスタンス作成機能がある
○ ReflectionClass::newInstance()
○ ReflectionClass::newInstanceArgs(array
$args)
● 歴史の長いライブラリはこちらを使っていることも
○ ...による引数展開はPHP 5.6 (2014) からの機能


# Page. 29

![Page Image](https://bcdn.docswell.com/page/K74W9DLPE1.jpg)

もう1つのインスタンス作成方法
● LaravelのDIコンテナはnewInstanceArgs()だった
○ のを先日new方式に変えました
(laravel/framework#58391)


# Page. 30

![Page Image](https://bcdn.docswell.com/page/LJ1YKZLXEG.jpg)

PSR-11
● DIコンテナのインターフェースのデファクトスタンダード
○ https://www.php-fig.org/psr/psr-11/
● 多くのDIコンテナライブラリはこれをimplementしている


