在我的代码库上运行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值?
发布于 2017-07-05 19:58:49
不幸的是,您不能使用扩展来覆盖有关现有方法的信息。目前还没有办法让PHPStan相信一个方法的签名与代码中的签名不同。
我对报告的错误感到有点困惑,因为UsernamePasswordToken目前接受mixed (任何意思)作为$credentials的类型。所以你的问题可以通过升级Symfony来解决(不确定升级到哪个版本)。我也不知道你引用eraseCredentials方法是什么意思。
如果您需要解决类似的问题,并且即使在最新版本的依赖项中,参数文档也是错误的,那么您目前有两个选择:
1)向修复其typehint或phpDoc的服务提供商发送PR。2)为ignoreErrors (参见README)编写一个忽略此问题的正则表达式。
在未来,还会有第三种选择。我计划通过提供配置选项来启用覆盖第三方类型。
https://stackoverflow.com/questions/44887075
复制相似问题