首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHPStan扩展:动态返回类型和变量函数参数

PHPStan扩展:动态返回类型和变量函数参数
EN

Stack Overflow用户
提问于 2022-05-13 12:39:38
回答 1查看 249关注 0票数 0

从PHPStan 1.6开始,就可以使用条件返回类型了,在这里我可以做以下事情:

代码语言:javascript
复制
/**
 * @param string $x
 * @return ($x is literal-string ? literal-string : string)
 */
public function isNull($x)
{
}

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

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

代码语言:javascript
复制
/**
 * @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)
{
}

但我不知道如何处理变函数参数,函数可以接受任意数量的值。

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

也许类似于以下几点(不起作用):

代码语言:javascript
复制
/**
 * @param string ...$x
 * @return ($x is array<literal-string> ? literal-string : string)
 */
function example(...$x) {
    return implode(', ', $x);
}

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

这与PHPStan原则扩展和拉动请求324有关。

一种选择是使用动态返回类型扩展 (我可能会回想起)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-07-29 13:30:59

解决方案是使用@template

代码语言:javascript
复制
/**
 * @template T of string
 * @param T ...$x
 * @return (T is literal-string ? literal-string : string)
 */
public function countDistinct(...$x) {
}

但是这不适用于DoctrineORM2.x,因为它使用($x)而不是(...$x)作为参数(来源),PR 9911为3.x修复了这些参数。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72229763

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档