class Hoge {
// 何かしらの処理
}
というようなクラスがあり、それを
class Factory {
public static function getHogeInstance() {
return new Hoge();
}
}
みたいな感じでインスタンスを生成するファクトリークラスがあるとして、
$hoge = Factory::getHogeInstance();
ってやると、当然Hogeオブジェクトを取得できるのだけど、Eclipse的には$hogeがHogeオブジェクトだとは分からないので、コード補完してくれない。
そこで、FactoryクラスのgetHogeInstanceメソッドにPHPDocのコメントを書いてやる。
class Factory {
/**
* Hogeオブジェクト取得
* @return Hoge
*/
public static function getHogeInstance() {
return new Hoge();
}
}
これで呼び出し元ではコード補完してくれるので、今まではそうやって対応してきたのだけど、これだとFactoryクラスで別のオブジェクトを返したくなった場合、返すオブジェクトの数だけ別のメソッドを作らなければいけなくなってします。
new $class()
みたいな感じで動的にインスタンスは作成できても、コメントは動的に書きようがないので、Eclipse的にはどのオブジェクト型なのかわからず、コード補完できない。
っていう問題にかれこれ1年以上悩まされていたのだけど、昨日、遂に問題が解決した。
以下、修正コード。
ファクトリークラス
class Factory {
/**
* Hogeオブジェクト取得
* @param string $class
* @return Ambigous
*/
public static function getInstance( $class ) {
return new $class();
}
}
呼び出し元
/* @var $hoge Hoge */
$hoge = Factory::getInstance( Hoge::class );
ポイントは呼び出し元に書いた
/* @var $hoge Hoge */
というコメント。
こう書いてやると、メソッド内の変数でも型を指定できるので、Eclipseで補完してくれるようになります。
ちょっと長い説明になっちゃったけど、この感動が伝わったかな・・・
これでかなりコーディング量が削減できそうで、とってもゴキゲンです。