变量“cast”的Phpdoc?

时间:2017-10-27 22:33:03

标签: php phpdoc

基类:

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?

1 个答案:

答案 0 :(得分:3)

您可以覆盖PHPStorm自动完成的继承属性:

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

但是,我个人认为你正试图解决错误的问题。如果您有一个返回 AB的工厂类,则不应该键入提示返回值A。相反,你应该同时提供:

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

这两个选项都足以告诉PHPStorm它让两个方法都显示为自动完成选项,但后者在代码实际执行方面是准确的(好吧,不是在这个例子中,但考虑到函数名称,我想那个&#39 ; s你的真实世界的实现。)