基类:
abstract class A
{
public function methodA() { echo __FUNCTION__.'<br>'; }
}
class B extends A
{
public function methodB() { echo __FUNCTION__.'<br>'; }
}
到目前为止一切顺利。
可以创建其中任何一个的工厂:
class Factory
{
/**
* @return A
*/
public static function createAorB()
{
return new B();
}
}
phpdoc是对的,因为它说“返回来自A
的东西”。
现在棘手的部分来了:
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?
答案 0 :(得分:3)
您可以覆盖PHPStorm自动完成的继承属性:
/**
* @property B $var
*/
class OwnClassB extends OwnClass
{
//...
}
但是,我个人认为你正试图解决错误的问题。如果您有一个返回 A
或B
的工厂类,则不应该键入提示返回值A
。相反,你应该同时提供:
class Factory
{
/**
* @return A|B
*/
public static function createAorB()
{
return new B();
}
}
这两个选项都足以告诉PHPStorm它让两个方法都显示为自动完成选项,但后者在代码实际执行方面是准确的(好吧,不是在这个例子中,但考虑到函数名称,我想那个&#39 ; s你的真实世界的实现。)