【问题标题】:PHPStan - change type of constructor parameterPHPStan - 更改构造函数参数的类型
【发布时间】:2017-07-03 13:40:39
【问题描述】:

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

【问题讨论】:

    标签: static-analysis phpstan


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 显然我有一个旧版本的symfony/security-core。我更新了它,现在这个错误消失了。不过,我仍然有几个这个问题的实例。我已经为这些情况添加了忽略规则。
    猜你喜欢
    • 2015-11-05
    • 2010-12-05
    • 2012-09-22
    • 2012-07-02
    • 2017-09-14
    • 1970-01-01
    • 2020-10-17
    • 1970-01-01
    • 2018-07-26
    相关资源
    最近更新 更多