1

在我的代码库上运行 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|nullstring.

我想我需要一个实现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属性同时接受stringnull值?

4

1 回答 1

2

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

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

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

1) 将 PR 发送到修复其 typehint 或 phpDoc 的依赖关系。2) 为忽略此问题编写一个正则表达式ignoreErrors(参见自述文件)。

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

于 2017-07-05T11:58:49.170 回答