Php 如果返回值是混合的,则使用哪种类型的提示?

Php 如果返回值是混合的,则使用哪种类型的提示?,php,return,php-7,type-hinting,Php,Return,Php 7,Type Hinting,由于mixed不是真正的类型,因此: 致命错误:未捕获的TypeError:foo()的返回值必须是 混合的实例 有没有一种方法可以键入提示一个混合的返回值,或者在这种情况下您只是不声明类型提示?类型提示用于对传递或返回的值实施一些限制。因为“mixed”允许任何值,所以将其用作类型提示是毫无意义的,所以只需忽略它即可 从PHP8.0开始,这将允许您将示例中的返回类型声明为bool | string。(还有一种特殊情况是在联合中包含false,如false | string,因为它通常用于表示失

由于
mixed
不是真正的类型,因此:

致命错误:未捕获的TypeError:foo()的返回值必须是 混合的实例


有没有一种方法可以键入提示一个
混合的
返回值,或者在这种情况下您只是不声明类型提示?

类型提示用于对传递或返回的值实施一些限制。因为“mixed”允许任何值,所以将其用作类型提示是毫无意义的,所以只需忽略它即可

从PHP8.0开始,这将允许您将示例中的返回类型声明为
bool | string
。(还有一种特殊情况是在联合中包含
false
,如
false | string
,因为它通常用于表示失败,但不用于
true

在旧版本中,可以在docblock中记录函数的返回值。IDE和文档生成器通常理解语法
@return bool | string
。即使您使用的是PHP8,您也可能希望使用它来添加一个说明,说明返回类型为什么会变化,以及何时应该使用哪种类型


当然,一个值得考虑的选择是重新考虑您的设计,并提出一个函数,该函数可以传递其结果,而无需针对不同的情况返回不同的类型。例如,使用异常而不是错误的特殊值,或者将函数(如
getThing(boolean$asString):float | string
拆分为两个函数
getThingAsFloat():float
getthingastring():string

我认为您只是没有声明它们。这里的问题类似:虽然我不认为它是重复的.FWIW,但考虑将RFC包含在7.4中,我认为“最终”选项可能是这里的第一个选项。若yer方法可能返回不同的类型,那个么它可能做得太多了,或者它的设计可能以另一种方式中断。不管怎样,这可能是再次查看设计的一个很好的提示。@AdamCameron在许多情况下,混合值是可以接受的。许多PHP本机函数返回混合值(例如,
mysqli_query()
),但我不会引用返回混合类型的本机PHP函数作为良好设计的示例。您引用的一个例子是PHP历史上混乱不堪的一个主要例子:它应该返回一个resultset(可能是空的),或者引发一个异常。在布尔返回值的情况下,有一种处理这种情况的垃圾方法。我想你会发现,其他类似的PHP函数也可能表明设计不够完美。@AdamCameron什么是“好的设计”或“可接受的”,这在一定程度上是主观判断,但总的来说,我同意你的看法。如果您正在努力思考返回类型提示,甚至要编写这样的问题,那么您可能可以花一点时间来检查避免它们是否会使API更易于使用。Def。因此,我在最初的评论中自由地使用了“可能”和“可能”等词。我的评论是一个提示,只是检查以验证当前方法是否正确,而不是说它不正确。
function foo ($a): mixed
{
    if ($a == 1)    
        return true;
    else
        return 'foo';
}

var_dump(foo(1));