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 属性 接受 stringnull 值?

遗憾的是,您不能使用扩展来覆盖有关现有方法的信息。目前没有办法让 PHPStan 相信某个方法的签名与代码中的签名不同。

我对报告的错误有点困惑,因为 UsernamePasswordToken 目前接受 mixed(任何意思)作为 $credentials 的类型。所以你的问题可以通过升级 Symfony 来解决(不确定到哪个版本)。而且我不知道你引用 eraseCredentials 方法是什么意思。

如果您需要解决类似的问题,并且即使在您的依赖项的最新版本中,参数文档也是错误的,您目前有两个选择:

1) 向修复其类型提示或 phpDoc 的依赖项发送 PR。 2) 为 ignoreErrors 写一个正则表达式(见 README)忽略这个问题。

以后还会有第三种选择。我计划通过提供配置选项来启用覆盖第 3 方类型。