2017-10-27 3 views
1

基底クラス:これまで変数 "キャスト"のPhpdoc?

abstract class A 
{ 
    public function methodA() { echo __FUNCTION__.'<br>'; } 
} 

class B extends A 
{ 
    public function methodB() { echo __FUNCTION__.'<br>'; } 
} 

とても良いです。それらのいずれかを作成することができ 工場:それは「Aから何か来るを返す」と言うので、

class Factory 
{ 
    /** 
    * @return A 
    */ 
    public static function createAorB() 
    { 
     return new B(); 
    } 
} 

phpdocのは、権利です。 今トリッキーな部分が来る:

class OwnClass 
{ 
    /** 
    * @var A 
    */ 
    protected $var; 

    public function __construct() 
    { 
     $this->var = \Factory::createAorB(); 
    } 
} 

class OwnClassB extends OwnClass 
{ 
    public function callMe() 
    { 
     $this->var->methodA(); 
     $this->var->methodB(); // this will also run, but IDE wont autocomplete with this method 
    } 
} 

(new OwnClassB())->callMe(); 

これは確かに実行されますが、methodB()呼び出しをチェックします。 IDEはこの方法では自動完成しません。そのvarが現在Bで、AではなくphpDocであることをどのように伝えるか?

+1

'@return A'が実際に正しいかどうか、' B'を返すときは明確ではありませんか? PHPStorm(少​​なくとも)は 'protected $ var'変数に' @var B 'があれば自動的に正しく自動完成します。(PHPStorm.Lintsでテスト済みで実証済みで、この1回の変更で自動的に正常終了します) –

+1

@cale_b 'A'は' B'の継承連鎖の一部なので正しいです。 phpdocは、このメソッドはクラスAの定義に従ったクラスを返すとしか言いません。Bはそれを行います(Aを拡張するので)。これは、PHPStormが自動補完しない理由です。これは、現在のヒントから 'methodB'が存在すると仮定できないためです。 – MatsLindh

答えて

3

あなたがPHPStormの自動補完のために継承されたプロパティをオーバーライドすることができます。

/** 
* @property B $var 
*/ 
class OwnClassB extends OwnClass 
{ 
    //... 
} 

をしかし、私は個人的に間違った問題を解決しようとしていると思います。 を返すFactoryクラスがある場合は、AまたはBのいずれかのヒントを入力すると、Aにヒントを入力しないでください。代わりに、あなたは両方を提供する必要がありますないこの例では、ウェル(

class Factory 
{ 
    /** 
    * @return A|B 
    */ 
    public static function createAorB() 
    { 
     return new B(); 
    } 
} 

両方のオプションが十分にそれはあなたのオートコンプリートオプションとして両方の方法を表示させるためにPHPStormを通知しますが、後者は、コードが実際に何をするかという点で正確です関数名を指定すると、それがあなたの実際の実装がしていることだと思います)。

+1

AとBの両方のヒントは間違っています。これは将来のC、D ....と返される可能性があるためです。 –

+1

この場合、 'A | B | C | D 'のヒントは逆効果になります実際には適用されないオートコンプリートオプションがたくさんあります。それから、最初の選択肢はおそらくより良い選択です。 – rickdenhaan

関連する問題