概要
俺は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 MyTraitOneAlpha
{
public function doSomethingOne()
{
/******************************************************************
* MyClassParentの $_cp のメソッドを使うべく入力中だが、補完が出ない
* このtraitはどこにも関連付けられていないので、そりゃそうだ
******************************************************************/
// 出ない
$this->_c
// もちろん出ない
$this->_cp->method
}
}
MyClassParentの子クラスにしかくっつけない前提のtraitだから、どうにかしてこのtraitがMyClassParent
であるとIDEに思い込ませたいんだけど、うまい方法が分からん。
解決案1
phpDocumentorを貼った子traitを作ってなんとかする
trait EnableGetClassComplicated
{
/**
*
* @return \ClassComplicated
*/
public function getCp() : \ClassComplicated
{
return $this->_cp;
}
}
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 EnableGetClassComplicated
{
/**
*
* @return \ClassComplicated
*/
public function getCp() : \ClassComplicated
{
return parent::getCp();
}
}
入力補完のためにtrait独自の新しいメソッドが生えるというのは良くないと思うので、親を見るだけの解決案2で俺はやろうと思っています。
(入力補完のために親に生やしていることになるが、ただのgetterだからまあいいだろうの精神)
締め
もっといい方法があったら教えて下さい。