c4se記:さっちゃんですよ☆

.。oO(さっちゃんですよヾ(〃l _ l)ノ゙☆)

.。oO(此のblogは、主に音樂考察Programming に分類されますよ。ヾ(〃l _ l)ノ゙♬♪♡)

音樂は SoundCloud に公開中です。

考察は現在は主に Scrapbox で公表中です。

Programming は GitHub で開發中です。

PHPでDI (依存性の注入) framworkを作るのはあなたでn人目です!

追記 2014-12-12
AOPも実装した0.2.0をリリースしました。
cf. PHPで簡単に華麗にDIとAOPをキメる http://c4se.hatenablog.com/entry/2014/12/11/013136

わたしがn-1人目です! (nは1以上の自然数)

f:id:Kureduki_Maari:20141031191818p:plain

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する組み合はせが多く成ってくれば、XMLYAML fileで設定を書くこともできます。……ん? 設定file…?
Zend FramworkのDIも、あまり変はらず、複雑に成ればarrayで設定を書けます。ん、設定…。
使用してゐる人が多さう (Packagist調べ) なnette/diorno/dijoomla-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するときにちと面倒なので、他並に簡単にしました。

特徴は、

  1. Pimple 3と100%互換です。Pimple 3からの移行は use Pimple\Container; を use Ranyuen\Di\Container; に書き換へるだけです。Pimple 2からは、Pimple 3への移行と同じ手順が必要になります (確か new Pimple; を new \Pimple\Container; に置換へるだけです、確か)。
  2. Ray.Diと同じく、DIの設定をannotationとして書けます。
  3. test済みです。
  4. あとはいい具合に察してくれます。

一例。

<?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で検索してください。
JavaC#だと一生懸命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
わたしはガンガン導入するのでもないし使ひませぬが、好きにしてください。