php - 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()
从不返回Base
. 该代码只适用于派生类Child
。事实上,接口和基类都在一个库中(依赖),所以我什至无法更改该代码。
a()
我可以像这样在我的Child
课堂上重新实现:
public function a(): Child {
parent::a();
return $this;
}
但这也很丑陋,更糟糕的是,这是一个玩具示例。在真正的课堂上,我不得不重新实现许多方法。很坏。
解决方案
您需要@return static
:https ://phpstan.org/r/42ee409c-ada2-44c9-a26d-6a85c2327bca
要了解所有不同的 PHPDoc 可能性,请访问 PHPStan 文档:
推荐阅读
- regex - 正则表达式仅匹配两个字母,其中一个均匀出现
- apache-flink - Flink Sql 未将 RAW('org.apache.avro.util.Utf8', '...') 转换为字符串
- typescript - Prettier 不检测/修复线长
- android - 如何在使用片段的 MVVM 架构中隐藏 SplashScreen 下的数据获取
- vba - 在 Visio VBA 中有没有办法将形状位置引用到标尺?
- ansible - 如何使用 ansible 在 Juniper Switch 上切换 vlan
- algorithm - O(1) 空间中 -n 到 n 范围内列表的第一个重复值
- docker - mkdir:无法创建目录:尝试读取 docker 容器中的文件时权限被拒绝
- docker - 我的 nginx 配置与 docker 有什么问题?
- ios - 在 SwiftUI 中以编程方式更改选项卡不会更新子视图