PhpStorm:处理 "return value is expected to be ..." 警告的最佳方法是什么?

PhpStorm: what is the best way to handle "return value is expected to be ..." warning?

我的 PHP 代码结构如下(此结构不可更改):

class BaseFooClass {
}

class ChildFooClass1 extends BaseFooClass {
}

class ChildFooClass2 extends BaseFooClass {
}

//... (there are like a hundred child foo classes)

class BaseBarClass {
    protected function getFooBase($input) : BaseFooClass 
    {
        $class = "ChildFooClass" . $input;
        return new $class();
    }
}

class ChildBarClass1 extends BaseBarClass {
    public function getFoo() : ChildFooClass1 
    {
        return $this->getFooBase(1);
    }
}

现在在ChildBarClass1中的getFoo()函数中,PhpStorm会给出警告“Return value is expected to be 'ChildFooClass1', 'BaseFooClass' returned”它正确地这样做了。

但是我想要一个没有警告的干净代码而不改变这个结构。

我通过添加 PHP 文档尝试了以下操作:

    public function getFoo() : ChildFooClass1 
    {
        /** @var ChildFooClass1 $foo **/
        $foo = $this->getFooBase(1);
        return $foo;
    }

但是这次它给出了不同的警告“不必要的局部变量”并要求我将其内联。

是否有消除警告的好方法?

编辑:也尝试了以下方法,但仍然出现“Return value is expected ...”的警告。

    /**
     * @return ChildFooClass1
     */
    public function getFoo() : ChildFooClass1 
    {
        return $this->getFooBase(1);
    }

给定你的代码 BaseBarClass::getFooBase() returns a BaseFooClass while ChildBarClass1::getFoo() wants to return a ChildFooClass1.

这违反了 php 的 Covariance/Contravariance 规则,根据该规则您只能 return 更具体的类型而不是更通用的类型,PhpStorm 会正确警告您。

因此您可以遵守此规则 (good) 并重构您的代码或抑制错误 (bad)。

例如:

// corrected type:
class ChildBarClass1 extends BaseBarClass
{
    public function getFoo(): BaseFooClass
    {
        return $this->getFooBase(1);
    }
}

// error suppressed:
class ChildBarClass1 extends BaseBarClass
{
    public function getFoo(): ChildFooClass1
    {
        /** @noinspection PhpIncompatibleReturnTypeInspection */
        return $this->getFooBase(1);
    }
}