追記 2014-12-12
AOPも実装した0.2.0をリリースしました。
cf. PHPで簡単に華麗にDIとAOPをキメる http://c4se.hatenablog.com/entry/2014/12/11/013136
Simple Ray.Di style DI (Dependency Injector) extending Pimple.
cf. Ranyuen/Di https://github.com/Ranyuen/Di
既存のDI framwork
PHPでDI (Dependency Injection, 依存性の注入) framworkは沢山あります。Javaだとなんですか? EJBとSpring Framworkと…?
Phalconを使ふてゐるのならPhalconのDIを使っとけばいいと思ひます。しかし (逆説の接続詞) PECLできない環境だったりして、Phalconを使へなければ。Rubyだとclassをobjectとしてぶん回したりinstance_evalしたりmethod_missingしたり好き勝手やるのですが、PHPではできません。そこでrefactoringする時に「あ、DIが欲しい」と思ひますので (思ひますので)、PHPのDI framworkを探します。沢山あります。あわわ。泡々。
Symfony ComponentのDIは、よくtestされてさうな先入観をもってゐます。悪くないです。DIする組み合はせが多く成ってくれば、XMLやYAML fileで設定を書くこともできます。……ん? 設定file…?
Zend FramworkのDIも、あまり変はらず、複雑に成ればarrayで設定を書けます。ん、設定…。
使用してゐる人が多さう (Packagist調べ) なnette/diもorno/diもjoomla-framework/diもあまり変らない気がします。設定や設定fileはありません。
すこし眺めたりしてるAura.Diも殆ど変はりがありません。
Pimpleですよ、Pimple。ArrayAccessでsimpleな見栄え。入れる、入れる時に取り出せる、後でも取り出す、以上。いやー、でもだんだんめんどくさくなってきますね。やはり設定fileなのだらうか…。
最後にRay.Diです。以前使ってみました (cf. PHP でRay.DiとRay.Aopをやってみる http://c4se.hatenablog.com/entry/2013/12/20/015945 )。JavaのGuiceみたいに、annotationを書いておけばしゅるしゅるとinjectされます。おお。EJB 3ぽい。
そこでRanyuen/Diです
そこで、ではありません。順接で受ける事項がなにもありません、恥を知りなさい。
Pimpleの見栄えに、Ray.Diの簡単さがあればいいな、とおもひ作りました。また、です。さう、また、なんだ…。Ray.Diも、実際にinjectionするときにちと面倒なので、他並に簡単にしました。
特徴は、
- Pimple 3と100%互換です。Pimple 3からの移行は use Pimple\Container; を use Ranyuen\Di\Container; に書き換へるだけです。Pimple 2からは、Pimple 3への移行と同じ手順が必要になります (確か new Pimple; を new \Pimple\Container; に置換へるだけです、確か)。
- Ray.Diと同じく、DIの設定をannotationとして書けます。
- test済みです。
- あとはいい具合に察してくれます。
一例。
<?php $container = new Container; $container->bind('Momonga', 'momonga', function ($c) { return new Momonga; }); class Yuraru { public $benri; public $id; /** @Inject */ public $momonga; /** @Inject */ public function __construct($momonga, $id = '') { $this->benri = $momonga; $this->id = $id; } } $yuraru = $container->newInstance('Yuraru', ['Sample ID.']); var_dump($yuraru->benri instanceof Momonga); var_dump($yuraru->id === 'Sample ID.'); var_dump($yuraru->momonga instanceof Momonga); class Gardea { /** @Inject */ public $momonga; } $gardea = new Gardea; $container->inject($gardea); var_dump($gardea->momonga instanceof Momonga);
Ranyuenのweb siteで実用してゐます。実用の必要から作りました (正直Ranyuen/web本体に含めとくのが面倒だったので叩き出した。おかげで機能を追加できる。分割統治だ)。
documentはGithubの方にあるので、そっちで読んでください。
Simple Ray.Di style DI (Dependency Injector) extending Pimple.
cf. Ranyuen/Di https://github.com/Ranyuen/Di
実装。PHPのannotationに就いて
reflectionは一生懸命ReflectionClassやReflectionMehtodやReflectionProperty等 [など] を使ったりして頑張ります。PHPのdocumentで検索してください。
JavaやC#だと一生懸命annotationを作ったりしますが、PHPにそんなものは有りません。classやmethodやpropertyのDocCommentがとれますので、文字列処理します。以上です。
2014-11-13 追記
doctrine/annotations と云ふのも有るやうです。PHP-DIで使うてゐました。
cf. doctrine/annotations https://github.com/doctrine/annotations
cf. 2. Doctrine Annotations — Doctrine Common 2.1 documentation http://doctrine-common.readthedocs.org/en/latest/reference/annotations.html
わたしはガンガン導入するのでもないし使ひませぬが、好きにしてください。