先日 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 をうまいこと作成するようにしておけばそんな必要はなくなります。