Slide 1

Slide 1 text

100行で書ける PSR-11 PHP Conference 小田原2025

Slide 2

Slide 2 text

自己紹介 名前:おぎ PHPer歴:5年 住んでるところ:秘境グンマー 所属:カオナビ 好きなPHP関数:array_key_exists()

Slide 3

Slide 3 text

PSR(PHP Standards Recommendations)とは? ● PHPの標準仕様を定めたガイドライン ● PSR-12(コーディング規約)、PSR-4(オートロード)など ● PSRを守ることでメンテナンスしやすくなる ● 準拠していないライブラリも 多い ● 主要なフレームワークが離脱してしまっている ※詳しくはPHPerのための「PHP標準コーディングルール( PSR)について語り合う」 TechCafeあたりを読んでくれ!

Slide 4

Slide 4 text

PSR-11 Container Interface ● 「DIコンテナ」の標準仕様 ● メソッドはget()とhas()の2つだけ ● 主要なDIコンテナの実装は準拠してる ○ 理論上は差し替え可能(※諸説あり)

Slide 5

Slide 5 text

PSR-11 Container Interfaceの仕様 ● get():取得 ○ ID(文字列)をパラメーターに取る ○ 戻り値はmixed(=IDの実体) ○ コンテナがIDを識別できない場合は NotFoundExceptionInterfaceを実装した例外を投げる ○ 同じIDの指定に対しては同じ値が返却されるべき(シングルトンかは実装による) ● has():取得の可否 ○ ID(文字列)をパラメーターに取る ○ コンテナがIDを識別できる場合は trueを、そうでない場合は falseを返す ○ hasの返り値がfalseならget()は必ずNotFoundExceptionInterfaceを実装した例外を投げる

Slide 6

Slide 6 text

≒PHPの配列 (ハッシュマップ)

Slide 7

Slide 7 text

なんとなく作れそうでは?

Slide 8

Slide 8 text

なんちゃってDIコンテナの素 ①インスタンスを入れておく配列 ②生成ルールを入れておく配列 ③生成ルールの登録メソッド

Slide 9

Slide 9 text

使用例

Slide 10

Slide 10 text

期待値

Slide 11

Slide 11 text

PSR-11 Container Interfaceの仕様 ● get() ○ ID(文字列)をパラメーターに取る ○ 戻り値はmixed(=文字列に対応したインスタンス) ○ IDを識別できない場合はNotFoundExceptionInterfaceを実装した例外を投げる ○ 同じIDの指定に対しては同じ値が返却されるべき(シングルトンかは実装による) ● has() ○ ID(文字列)をパラメーターに取る ○ IDを識別できる場合はtrueを、そうでない場合はfalseを返す ○ hasの返り値がfalseならget()は必ず例外(NotFoundExceptionInterface)を投げる

Slide 12

Slide 12 text

get():コンテナから取り出す ①stringでIDを引数に取る ②戻り値は mixed ③解決できないものは例外 ④既に解決済であれば解決済のものを返す ④解決済でなければ作る

Slide 13

Slide 13 text

PSR-11 Container Interfaceの仕様 ● get() ○ ID(文字列)をパラメーターに取る ○ 戻り値はmixed(=文字列に対応したインスタンス) ○ IDを識別できない場合はNotFoundExceptionInterfaceを実装した例外を投げる ○ 同じIDの指定に対しては同じ値が返却されるべき(シングルトンかは実装による) ● has() ○ ID(文字列)をパラメーターに取る ○ IDを識別できる場合はtrueを、そうでない場合はfalseを返す ○ hasの返り値がfalseならget()は必ず例外(NotFoundExceptionInterface)を投げる

Slide 14

Slide 14 text

has():コンテナから取り出せるか判定する ①解決方法が登録されてる ②取り出せる ③ダメ元で生成を試みる(雑

Slide 15

Slide 15 text

簡単ですね!

Slide 16

Slide 16 text

もう少しだけ詳しく

Slide 17

Slide 17 text

resolve():IDから返却値を解決する ④生成方法わからんくてもクラスなら Autoloadでチャレンジ ①クラスならインスタンス生成 ②コールバックなら呼び出してみる ③それ以外なら多分値 ⑤生成方法ワカランので例外処理

Slide 18

Slide 18 text

build():クラスの生成を行う ①ReflectionClassでコンストラクタを解析 ③パラメーターを解析して再帰的に取得 ④取得した依存を注入して返却 ②依存がなければそのままnewして返却

Slide 19

Slide 19 text

完全に理解しましたね?

Slide 20

Slide 20 text

四角い車輪の再発明 ≒理解が捗る

Slide 21

Slide 21 text

四角い車輪の再発明 ≒理解が捗る

Slide 22

Slide 22 text

四角い車輪の再発明 =楽しい

Slide 23

Slide 23 text

みんなも気軽に作ってみよう! (※本番投入はダメ絶対)

Slide 24

Slide 24 text

FIN.

Slide 25

Slide 25 text

Appendix - PSR-11: Container interface - PHPerのための「PHP標準コーディングルール( PSR)について語り合う」Tech Cafe - php-fig/container - PSR と各ライブラリ実装から DI コンテナの要件を整理する - DIYContainer - 今こそ理解するDI(Dependency Injection) - コードを読もうぜ!~ Laravel編~【プログラミング】 - namespaceとautoloading - GoFデザインパターンとDI w/twada - 作って理解するDIコンテナ - illuminate/container