PHPStan - 更改构造函数参数的类型
PHPStan - change type of constructor parameter
当 运行 PHPStan 在我的代码库上时,我收到错误:
Parameter #2 $credentials of class Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken constructor expects string, null given.
这是因为构造函数的文档块仅将字符串指定为有效类型。但是当您检查 eraseCredentials()
方法时,似乎 null
也是 $credentials
.
的有效值
现在我想告诉 PHPStan $credentials
参数的类型是 string|null
而不是 string
.
我想我需要 MethodsClassReflectionExtension
的实现来做到这一点。但是当我注册这个时,它似乎没有被要求为正确的 class.
我当前的实现:
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
值?
遗憾的是,您不能使用扩展来覆盖有关现有方法的信息。目前没有办法让 PHPStan 相信某个方法的签名与代码中的签名不同。
我对报告的错误有点困惑,因为 UsernamePasswordToken 目前接受 mixed
(任何意思)作为 $credentials
的类型。所以你的问题可以通过升级 Symfony 来解决(不确定到哪个版本)。而且我不知道你引用 eraseCredentials
方法是什么意思。
如果您需要解决类似的问题,并且即使在您的依赖项的最新版本中,参数文档也是错误的,您目前有两个选择:
1) 向修复其类型提示或 phpDoc 的依赖项发送 PR。
2) 为 ignoreErrors
写一个正则表达式(见 README)忽略这个问题。
以后还会有第三种选择。我计划通过提供配置选项来启用覆盖第 3 方类型。
当 运行 PHPStan 在我的代码库上时,我收到错误:
Parameter #2 $credentials of class Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken constructor expects string, null given.
这是因为构造函数的文档块仅将字符串指定为有效类型。但是当您检查 eraseCredentials()
方法时,似乎 null
也是 $credentials
.
现在我想告诉 PHPStan $credentials
参数的类型是 string|null
而不是 string
.
我想我需要 MethodsClassReflectionExtension
的实现来做到这一点。但是当我注册这个时,它似乎没有被要求为正确的 class.
我当前的实现:
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
值?
遗憾的是,您不能使用扩展来覆盖有关现有方法的信息。目前没有办法让 PHPStan 相信某个方法的签名与代码中的签名不同。
我对报告的错误有点困惑,因为 UsernamePasswordToken 目前接受 mixed
(任何意思)作为 $credentials
的类型。所以你的问题可以通过升级 Symfony 来解决(不确定到哪个版本)。而且我不知道你引用 eraseCredentials
方法是什么意思。
如果您需要解决类似的问题,并且即使在您的依赖项的最新版本中,参数文档也是错误的,您目前有两个选择:
1) 向修复其类型提示或 phpDoc 的依赖项发送 PR。
2) 为 ignoreErrors
写一个正则表达式(见 README)忽略这个问题。
以后还会有第三种选择。我计划通过提供配置选项来启用覆盖第 3 方类型。