LoginSignup
1
0

More than 3 years have passed since last update.

くっつけるクラスが特定の親クラスを持つことが分かっているtrait内で、そのクラスの入力補完を使いたい

Last updated at Posted at 2019-07-09

概要

俺はNetBeansを愛用しています。
traitの入力補完がうまくいかないので困りました。

設例

いろんなメソッドを持ったこういうクラスがあるとします。

いろんなメソッドを持ったクラス

class ClassComplicated
{
    public function __construct()
    {
       ;
    }
    public function methodA() : PDO{ return new PDO(); }
    public function methodB() : string { return 'a'; }
    public function methodC(){}
    public function methodD(){}
    public function methodE(){}
}

抽象クラスがあって、そいつは先述のクラスをプロパティに持っています。

抽象クラス

abstract class MyClassParent
{
    protected $_cp;

    public function __construct(ClassComplicated $cp)
    {
        $this->_cp = $cp;
    }

    abstract public function doSomethingOne();
    abstract public function doSomethingTwo();
    abstract public function doSomethingThree();
}

その抽象クラスを継承することを前提とした子クラスをいくつか実装するとします。
ただし、その子クラスたちはいろんな挙動の組み合わせとしたいので、抽象クラスの抽象メソッドは、traitで定義し、それをくっつけることとします。
(なぜtraitを使うかという動機の説明)

子クラス

class MyClassChildOne extends MyClassParent
{
    use MyTraitOneAlpha;   // doSomethingOneの実装
    use MyTraitTwoAlpha;   // doSomethingTwoの実装
    use MyTraitThreeAlpha; // doSomethingThreeeの実装
}

class MyClassChildTwo extends MyClassParent
{
    use MyTraitOneBeta;    // MyClassChildOneと比較すると、doSomethingOneだけ別の実装
    use MyTraitTwoAlpha;
    use MyTraitThreeAlpha;
}

いよいよtraitを実装しますが、この時、入力補完が利かない。

trait
trait MyTraitOneAlpha
{
    public function doSomethingOne()
    {
        /******************************************************************
         *  MyClassParentの $_cp のメソッドを使うべく入力中だが、補完が出ない
         *  このtraitはどこにも関連付けられていないので、そりゃそうだ
         ******************************************************************/
        // 出ない
        $this->_c
        // もちろん出ない
        $this->_cp->method
    }
}

実際の画像
image.png

MyClassParentの子クラスにしかくっつけない前提のtraitだから、どうにかしてこのtraitがMyClassParentであるとIDEに思い込ませたいんだけど、うまい方法が分からん。

解決案1

phpDocumentorを貼った子traitを作ってなんとかする

cp取る用のtrait
trait EnableGetClassComplicated
{
    /**
     * 
     * @return \ClassComplicated
     */
    public function getCp() : \ClassComplicated
    {
        return $this->_cp;
    }
}
修正したMyTraitOneAlpha
trait MyTraitOneAlpha
{
    use EnableGetClassComplicated;

    public function doSomethingOne()
    {
        // 出る
        $this->getCp()->
    }
}

image.png

解決案2

親クラスに入れとく

修正した親クラス
abstract class MyClassParent
{
    protected $_cp;

    public function __construct(ClassComplicated $cp)
    {
        $this->_cp = $cp;
    }

    abstract public function doSomethingOne();
    abstract public function doSomethingTwo();
    abstract public function doSomethingThree();

    /**
     * 
     * @return \ClassComplicated
     */
    public function getCp() : \ClassComplicated
    {
        return $this->_cp;
    }
}
traitは親を参照

trait EnableGetClassComplicated
{
    /**
     * 
     * @return \ClassComplicated
     */
    public function getCp() : \ClassComplicated
    {
        return parent::getCp();
    }
}

出る
image.png

入力補完のためにtrait独自の新しいメソッドが生えるというのは良くないと思うので、親を見るだけの解決案2で俺はやろうと思っています。
(入力補完のために親に生やしていることになるが、ただのgetterだからまあいいだろうの精神)

締め

もっといい方法があったら教えて下さい。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0