1

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;
    }

但这也很丑陋,更糟糕的是,这是一个玩具示例。在真正的课堂上,我不得不重新实现许多方法。很坏。

4

1 回答 1

5

您需要@return statichttps ://phpstan.org/r/42ee409c-ada2-44c9-a26d-6a85c2327bca

要了解所有不同的 PHPDoc 可能性,请访问 PHPStan 文档:

于 2020-05-22T09:12:12.367 回答