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()
从不返回Base
. 该代码只适用于派生类Child
。事实上,接口和基类都在一个库中(依赖),所以我什至无法更改该代码。
a()
我可以像这样在我的Child
课堂上重新实现:
public function a(): Child {
parent::a();
return $this;
}
但这也很丑陋,更糟糕的是,这是一个玩具示例。在真正的课堂上,我不得不重新实现许多方法。很坏。