Edited at

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


概要

俺は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
}
}

実際の画像

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()->
}
}



解決案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();
}
}

出る

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

(入力補完のために親に生やしていることになるが、ただのgetterだからまあいいだろうの精神)


締め

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