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);
}
}
我的 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);
}
}