【发布时间】: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 开始。