PHPStan - 更改构造函数参数的类型

时间:2017-07-03 13:40:40

标签: static-analysis phpstan

在我的代码库上运行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属性同时接受stringnull值?

1 个答案:

答案 0 :(得分:2)

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

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

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

1)将PR发送到修复其typehint或phpDoc的依赖项。 2)为ignoreErrors(请参阅README)写一个忽略此问题的正则表达式。

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