Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
“铸造”返回类型的PHPDoc_Php_Phpstorm_Phpdoc - Fatal编程技术网

“铸造”返回类型的PHPDoc

“铸造”返回类型的PHPDoc,php,phpstorm,phpdoc,Php,Phpstorm,Phpdoc,我有一种工厂,其中一个方法返回多个可能的类中的一个,但它们都继承相同的父类。当工厂方法获得相同的参数时,它总是返回相同的类。因此,当我从工厂方法收到一个类时,我知道公共父类旁边的子类 问题是,当我尝试将@return类型设置为子类时,PhpStorm会向我显示一条警告 这里有一个例子: 抽象类基类{} 类扩展了基{} 类B扩展了基{} T类{ /** *@param string$class *@返回基地 */ 公共函数返回基$class { 转换$class{ 案例“A”: 返回一个新的; 打

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

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

这里有一个例子:

抽象类基类{} 类扩展了基{} 类B扩展了基{} T类{ /** *@param string$class *@返回基地 */ 公共函数返回基$class { 转换$class{ 案例“A”: 返回一个新的; 打破 //…更多案例。。。 违约: 返回新的B; } } /** *@returna */ 公共功能测试 { return$this->returnBase'A';//警告:返回值应为'A','Base'返回 } }
我知道在这个例子中,我可以将returnBase的返回类型设置为A | B,但在我的实际代码中,我有更多的类。我不想将测试方法的返回类型设置为Base,因为子类可能具有唯一的方法/属性。

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

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

根据这篇关于,冗余变量对内存消耗没有任何影响。

当您删除关于函数returnBase返回“Base”的注释时,php storm中会发生什么情况?您可以通过将returnBase设置为@return mixed | Base来避免错误建议。此外,我建议使用接口而不是抽象对象作为返回类型检查。这将确保返回的对象符合接口,其中抽象对象和扩展抽象对象的对象需要满足接口中的定义。下面是我的建议示例,如果在switch case中返回,也不需要中断。PHPDoc在这里无能为力。只需使用混合或对象。至于工厂的功能——在相当多的插件和库中都能很好地使用——我认为这不会产生同样的警告,这有点奇怪,但它可以工作。不幸的是,至少在PhpStorm中,添加/**noinspection PhpIncompatibleReturnTypeInspection*/,这并不比仅仅通过添加/**noinspection PhpIncompatibleReturnTypeInspection*/来消除警告更容易。