首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHPStan -更改构造函数参数的类型

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

Stack Overflow用户
提问于 2017-07-03 21:40:40
回答 1查看 819关注 0票数 1

在我的代码库上运行PHPStan时,我得到以下错误:

代码语言:javascript
复制
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的实现来做到这一点。但是,当我注册它时,似乎没有为正确的类调用它。

我目前的实现:

代码语言:javascript
复制
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值?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-05 19:58:49

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

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

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

1)向修复其typehint或phpDoc的服务提供商发送PR。2)为ignoreErrors (参见README)编写一个忽略此问题的正则表达式。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44887075

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档