我有一些工厂,其中一个方法返回多个可能类中的一个,但它们都继承了相同的父类。工厂方法在获得相同参数时始终返回相同的类。因此,当我从工厂方法收到一个类时,我知道公共父类旁边的子类。
问题是,当我尝试将@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"因为子类可能有唯一的方法/属性。
答案 0 :(得分:1)
您可以为每个returnBase()
方法设置一个varibale类型,如下所示:
/**
* @return A
*/
public function test()
{
/** @var A $a */
$a = $this->returnBase('A');
return $a;
}
根据本文关于PHP’s Garbage Collection的内容,冗余变量对内存消耗没有任何影响。