我的库中有简化的代码示例,出于我不明白的原因,诗篇会输出警告。
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 该怎么办?那么如何检查传递给构造函数的参数的正确性?
抱歉英语不好。我希望我能够解释这个问题。
问题是您在
@param
中的类型声明与您的方法签名所说的不同。
与
in_array
的检查绝对有意义,因为正如你所说,并不是每个人都会使用诗篇作为保证。
一种方法是更改
@param
注释,让它知道您正在传递一个字符串,psalm 可以使用:
/**
* @param string $c
*/
但是这是多余的,因为 PHP 已经确保我们在那里有一个字符串,所以只需删除 doc 块也可以。