Php Psalm请求提供的值可能为空->;得到()

Php Psalm请求提供的值可能为空->;得到(),php,symfony,static-analysis,psalm-php,Php,Symfony,Static Analysis,Psalm Php,我有以下代码: $request->headers->get('Accept-Language', 'en'); 我提供了一个默认值,但Psalm认为它可能为null,因为->get()声明返回一个可为null的字符串: // vendor/symfony/http-foundation/HeaderBag.php /** * Returns a header value by name. * * @return string|null The first header va

我有以下代码:

$request->headers->get('Accept-Language', 'en');
我提供了一个默认值,但Psalm认为它可能为null,因为
->get()
声明返回一个可为null的字符串:

// vendor/symfony/http-foundation/HeaderBag.php
/**
 * Returns a header value by name.
 *
 * @return string|null The first header value or default value
 */
public function get(string $key, string $default = null) { /* */ }

如何修复此问题,使psalm知道它不是空的?

由于您无法控制上游库中的注释,因此您必须在自己的代码中向psalm提供缺少的信息

有两种方法可以解决这个问题:

转换为字符串,所以诗篇毫无疑问地告诉你什么类型的
get()

$a = (string) $request->headers->get('Accept-Language', 'en');
是的,演员阵容是多余的,但它清晰简洁。我通常这样做只是为了节约

您可以显式声明此
get()
调用的结果是一个字符串:

/** @var string $acceptLanguage **/
$acceptLanguage = $request->headers->get('Accept-Language', 'en');
最后,您只需在需要时抑制
PossiblyNullArgument

/** @psalm-suppress PossiblyNullArgument */
iWantAString($request->headers->get('Accept-Language', 'en'));
看到所有这些工作


您还可以将上面的一些方法与您自己的包装器方法结合起来处理从请求中获取值的问题,确保始终返回字符串。如果您这样做,如果找不到参数,您可能会抛出一个异常。

除了@yivi的答案向您展示了如何覆盖类型推断或抑制错误之外,您还可以通过直接在源代码中提供正确的docblock向Psalm解释类型(如果你能控制的话)或者在一个

/**
*按名称返回标题值。
*
*@psalm return($default为null?(string | null):string)
*/
公共函数get(字符串$key,字符串$default=null){/**}

如果您明确告知类型,则它不起作用?
/**@var string$yourVarName*/