在我的代码库上运行PHPStan时,我收到错误:
Parameter #2 $credentials of class Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken constructor expects string, null given.
这是因为构造函数的docblock仅将字符串指定为有效类型。但是当您检查eraseCredentials()
方法时,似乎null
也是$credentials
的有效值。
现在我想告诉PHPStan $credentials
参数的类型是string|null
而不是string
。
我想我需要MethodsClassReflectionExtension
的实现才能做到这一点。但是当我注册这个时,它似乎没有被要求正确的课程。
我目前的实施:
class UsernamePasswordToken implements MethodsClassReflectionExtension
{
public function hasMethod(ClassReflection $classReflection, string $methodName): bool
{
if ($classReflection->getName()===\Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken::class) {
var_dump(__FILE__ . ':' . __LINE__ . ' :: ' . __METHOD__);die();
}
if ($methodName === '__construct' && $classReflection->getName() === UsernamePasswordTokenClass::class) {
return true;
}
return false;
}
public function getMethod(ClassReflection $classReflection, string $methodName): MethodReflection
{
var_dump(__FILE__ . ':' . __LINE__ . ' :: ' . __METHOD__);die();
}
}
我需要做些什么才能让PHPStan明白$credentials
属性同时接受string
和null
值?
答案 0 :(得分:2)
很遗憾,您无法使用扩展来覆盖有关现有方法的信息。目前还没有办法让PHPStan相信某个方法的签名与代码中的签名不同。
我对报告的错误感到有点困惑,因为UsernamePasswordToken目前接受mixed
(意思是什么)作为$credentials
的类型。所以你的问题可以通过升级Symfony(不确定哪个版本)而消失。而且我也不会通过引用eraseCredentials
方法来了解您的意思。
如果您需要解决类似的问题,即使在最新版本的依赖项中参数文档也是错误的,您目前有两种选择:
1)将PR发送到修复其typehint或phpDoc的依赖项。
2)为ignoreErrors
(请参阅README)写一个忽略此问题的正则表达式。
将来会有第三种选择。我计划通过提供配置选项来启用覆盖第三方类型。