如何解决 Psalm 中的 DocblockTypeContradiction 问题

问题描述 投票:0回答:1

我的库中有简化的代码示例,出于我不明白的原因,诗篇会输出警告。

class Example {
    public const C_1 = 'val1';
    public const C_2 = 'val2';
    public const C_3 = 'val3';

    /**
    * @param self::C_1 | self::C_2 $c
    */
    public function __construct(string $c)
    {
       if (!in_array($c, [self::C_1, self::C_2], true)) {
            throw new InvalidArgumentException('Unsupported value');
        }
    }
}

if (!in_array($c, [self::C_1, self::C_2], true))
行上显示类型为
DocblockTypeContradiction
的警告和消息
Docblock-defined type "val1" for $c is always string(val1)

据我了解,诗篇需要删除检查

if (!in_array($c, [self::C_1, self::C_2], true))
,因为常量已经被诗篇检查过。但是,如果将使用我的库的用户不会在他的项目中使用 psalm 该怎么办?那么如何检查传递给构造函数的参数的正确性?

抱歉英语不好。我希望我能够解释这个问题。

php static-analysis lint psalm-php
1个回答
0
投票

问题是您在

@param
中的类型声明与您的方法签名所说的不同。

in_array
的检查绝对有意义,因为正如你所说,并不是每个人都会使用诗篇作为保证。

一种方法是更改

@param
注释,让它知道您正在传递一个字符串,psalm 可以使用:

/**
 * @param string $c
 */

但是这是多余的,因为 PHP 已经确保我们在那里有一个字符串,所以只需删除 doc 块也可以

© www.soinside.com 2019 - 2024. All rights reserved.