PhpStorm の PHPSTORM_META でサービスロケーターとかを入力補完

先日 Twitter を眺めていたら、PhpStorm Advanced Metadata というものを知ったので使ってみました。

下記はいわゆる社内勉強会的ななにかで話したときのスライドです。

スライドの通りですが、.phpstorm.meta.php という名前で次のようなファイルを用意しておくと、メソッドの引数に指定した文字列リテラルを元に戻り値の型が認識されるようになります。

<?php
namespace PHPSTORM_META {
    /** @noinspection PhpUnusedLocalVariableInspection */
    /** @noinspection PhpIllegalArrayKeyTypeInspection */
    /** @noinspection PhpDynamicAsStaticMethodCallInspection */
    $STATIC_METHOD_TYPES = array(
        \SL::get('') => array(
            'ore' instanceof \Ore,
            'are' instanceof \Are,
        ),
    );
}

そのため、次のようなコードでも入力補完が効きます。

<?php
class SL
{
    /**
     * @param string $name
     * @return mixed
     */
    public function get($name) {}
}

class Ore
{
    public function this_is_ore() {}
}

class Are
{
    public function this_is_are() {}
}

$o = new SL();
$o->get('ore')->this_is_ore();
$o->get('are')->this_is_are();

サービスロケーターを使っていると、オブジェクトのインスタンスをサービスロケーターから取得するたびにいちいち /* @var $ore Ore */ のように書く必要がありましたが、.phpstorm.meta.php をうまいこと作成するようにしておけばそんな必要はなくなります。