phpstan:如何处理派生的 class return 类型
phpstan: how to handle derived class return types
对于此示例代码,修复 phpstan
生成的错误的正确方法是什么?错误信息是:
Method Foo::foo() should return Child but returns Base.
<?php declare(strict_types = 1);
Interface MyI {abstract function a(): self;}
Class Base implements MyI {
public function a(): self {return $this;}
}
Class Child extends Base {
public function c(): self {return $this;}
}
Class Foo {
public function factory(): Child {return new Child();}
/**
* @return Child
*/
public function foo() /* note no return type */ {
return $this->factory()
->c()
->a();
}
}
消除错误的一种方法是将 @return
更改为:
/**
* @return Child | Base
*/
但我非常不喜欢,因为 foo()
从来没有 returns Base
的实例。该代码仅适用于派生的 class Child
。事实上,接口和基础 classes 都在库(依赖项)中,所以我什至无法更改该代码。
我可以像这样在 Child
class 中重新实现 a()
:
public function a(): Child {
parent::a();
return $this;
}
但这也很丑陋,更糟糕的是,这是一个玩具示例。在真实的 class 中,我不得不重新实现许多方法。非常糟糕。
为此你需要 @return static
:https://phpstan.org/r/42ee409c-ada2-44c9-a26d-6a85c2327bca
要了解所有不同的 PHPDoc 可能性,请访问 PHPStan 文档:
对于此示例代码,修复 phpstan
生成的错误的正确方法是什么?错误信息是:
Method Foo::foo() should return Child but returns Base.
<?php declare(strict_types = 1);
Interface MyI {abstract function a(): self;}
Class Base implements MyI {
public function a(): self {return $this;}
}
Class Child extends Base {
public function c(): self {return $this;}
}
Class Foo {
public function factory(): Child {return new Child();}
/**
* @return Child
*/
public function foo() /* note no return type */ {
return $this->factory()
->c()
->a();
}
}
消除错误的一种方法是将 @return
更改为:
/**
* @return Child | Base
*/
但我非常不喜欢,因为 foo()
从来没有 returns Base
的实例。该代码仅适用于派生的 class Child
。事实上,接口和基础 classes 都在库(依赖项)中,所以我什至无法更改该代码。
我可以像这样在 Child
class 中重新实现 a()
:
public function a(): Child {
parent::a();
return $this;
}
但这也很丑陋,更糟糕的是,这是一个玩具示例。在真实的 class 中,我不得不重新实现许多方法。非常糟糕。
为此你需要 @return static
:https://phpstan.org/r/42ee409c-ada2-44c9-a26d-6a85c2327bca
要了解所有不同的 PHPDoc 可能性,请访问 PHPStan 文档: