变量 "cast" 的 Phpdoc?

Phpdoc for variable "cast"?

基础类:

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 是对的,因为它说 "return something comes from 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

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

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

但是,我个人认为您试图解决错误的问题。如果你有一个 Factory class returns AB,你不应该键入提示 return 值改为 A。相反,您应该同时提供:

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

这两个选项足以让 PHPStorm 将这两个方法显示为自动完成选项,但后者在代码实际执行的操作方面是准确的(好吧,不是在这个例子中,但考虑到函数名称我猜这是您的实际实现是做什么的)。