PHPDoc for" casted"返回类型

时间:2017-04-01 22:27:39

标签: php phpstorm phpdoc

我有一些工厂,其中一个方法返回多个可能类中的一个,但它们都继承了相同的父类。工厂方法在获得相同参数时始终返回相同的类。因此,当我从工厂方法收到一个类时,我知道公共父类旁边的子类。

问题是,当我尝试将@return类型设置为子类时,PhpStorm会向我显示警告。

这是一个例子:

abstract class Base {}
class A extends Base {}
class B extends Base {}

class T {
    /**
     * @param string $class
     * @return Base
     */
    public function returnBase($class)
    {
        switch ($class) {
            case 'A':
                return new A();
                break;
            // ... more cases ...
            default:
                return new B();
        }
    }
    /**
     * @return A
     */
    public function test()
    {
        return $this->returnBase('A'); // Warning: "Return value is expected to be 'A', 'Base' returned"
    }
}

我知道在这个例子中我可以将returnBase()的返回类型设置为A|B,但在我的实际代码中我有更多的类。我不想将test()方法的返回类型设置为" Base"因为子类可能有唯一的方法/属性。

1 个答案:

答案 0 :(得分:1)

您可以为每个returnBase()方法设置一个varibale类型,如下所示:

/**
 * @return A
 */
public function test()
{
    /** @var A $a */
    $a =  $this->returnBase('A');
    return $a;
}

根据本文关于PHP’s Garbage Collection的内容,冗余变量对内存消耗没有任何影响。