【发布时间】:2018-04-09 14:31:01
【问题描述】:
基类:
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 不会使用此方法自动完成。如何用 phpDoc 判断 var 现在是 B,而不是 A?
【问题讨论】:
-
当您返回
B时,不清楚@return A实际上是如何正确的?如果您的protected $var变量上有@var B,PHPStorm(至少)会正确地自动完成...(在 PHPStorm 中测试和证明。Lints 正确,并且通过这一更改正确地自动完成)。 -
@cale_b 这是正确的,因为
A是B继承链的一部分。 phpdoc 只说该方法将返回一个符合类 A 定义的类。 B 这样做(因为它扩展了 A)。这也是 PHPStorm 不会自动完成的原因 - 因为你不能假设methodB从当前提示中存在。