基底クラス:これまで変数 "キャスト"の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であることをどのように伝えるか?
'@return A'が実際に正しいかどうか、' B'を返すときは明確ではありませんか? PHPStorm(少なくとも)は 'protected $ var'変数に' @var B 'があれば自動的に正しく自動完成します。(PHPStorm.Lintsでテスト済みで実証済みで、この1回の変更で自動的に正常終了します) –
@cale_b 'A'は' B'の継承連鎖の一部なので正しいです。 phpdocは、このメソッドはクラスAの定義に従ったクラスを返すとしか言いません。Bはそれを行います(Aを拡張するので)。これは、PHPStormが自動補完しない理由です。これは、現在のヒントから 'methodB'が存在すると仮定できないためです。 – MatsLindh