PHPStan模板变量绑定类型时命名空间识别异常求助
解决PHPStan模板绑定接口时的命名空间解析问题
- 你遇到的情况不是用法错误,大概率是旧版本PHPStan在解析
@template注解中的命名空间时存在bug,或者需要调整写法适配其类型解析规则。
两种错误的原因
- 第一种写法用
use B\FooInterface导入后,PHPStan却将FooInterface解析为当前命名空间下的A\FooInterface,说明旧版本PHPStan未正确识别注解中use导入的类型。 - 第二种写法用
\B\FooInterface时,PHPStan错误解析为A\B\FooInterface,是因为旧版本对根命名空间的反斜杠处理存在问题,误将其当作相对当前命名空间的路径。
解决方法
升级PHPStan到最新稳定版本
这是最直接的解决方案,新版本的PHPStan已经修复了不少注解类型解析的bug,升级后通常能正常识别use导入的类型或正确解析根命名空间的完全限定名。临时适配写法(无法升级时)
如果暂时不能升级,可以尝试用字符串包裹完全限定名的方式,强制PHPStan正确识别类型:namespace A; /** * @template T of "B\FooInterface" */ interface BarInterface { /** * @param T $baz * @return mixed */ public function doSomething($baz); }另外要确认
B\FooInterface确实存在于根命名空间下,而非A\B\FooInterface,如果是子命名空间,需要调整为对应的完全限定路径。
内容的提问来源于stack exchange,提问作者S. Parton
相关产品推荐
相关产品推荐

