【问题标题】:PHPStan Extension: Dynamic Return Types and a Variadic Function ParameterPHPStan 扩展:动态返回类型和可变函数参数
【发布时间】:2022-07-29 21:30:59
【问题描述】:

从 PHPStan 1.6 开始,可以使用Conditional Return Types,我可以在其中执行以下操作:

/**
 * @param string $x
 * @return ($x is literal-string ? literal-string : string)
 */
public function isNull($x)
{
}

这采用(<template param> is <union type> ? <union type> : <union type>) 的形式。

虽然不可能做更复杂的条件,但可以嵌套它们(即使有点乱):

/**
 * @param string $val
 * @param string $x
 * @param string $y
 * @return ($val is literal-string ? ($x is literal-string ? ($y is literal-string ? literal-string : string) : string) : string)
 */
public function between($val, $x, $y)
{
}

但我不确定如何处理Variadic Function Parameter,该函数可以接受任意数量的值。

所有值都是literal-string时,我想返回literal-string,否则返回string

可能类似于以下内容(不起作用):

/**
 * @param string ...$x
 * @return ($x is array<literal-string> ? literal-string : string)
 */
function example(...$x) {
    return implode(', ', $x);
}

这是对 PHPStan 中当前实现的限制,还是我遗漏了什么?

这与 PHPStan Doctrine Extension 和 Pull Request 324 有关。

一种选择是使用Dynamic Return Type Extension (which I might revert)。

【问题讨论】:

  • 可能有不同/更好的解决方案,但 Ondřej 已将其作为Feature Request 开始。

标签: static-analysis phpstan


【解决方案1】:

解决方案是使用@template,例如

/**
 * @template T of string
 * @param T ...$x
 * @return (T is literal-string ? literal-string : string)
 */
public function countDistinct(...$x) {
}

但这不适用于 Doctrine ORM 2.x,因为它使用 ($x) 而不是 (...$x) 作为其参数 (source),PR 9911 修复了 3.x。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多