如何在我自己的函数中使用混合参数类型?

How to use mixed parameter type in my own functions?

我想定义一个 PHP 7 函数,它接受一个混合类型的参数。 (我想要的是 C# 中泛型类型参数的等价物;如果在 PHP 7 中有更好的模拟方法,请告诉我。)

我的代码如下

<?php
declare (strict_types = 1);    

function test (mixed $s) : mixed {
    return $s;
}

// Works
echo gettype ('hello');
// Does not work
echo test ('hello');
?>

当我 运行 这段代码时,我得到以下信息。

Fatal error: Uncaught TypeError: Argument 1 passed to test() must be an instance of mixed, string given, called in mixed.php on line 11 and defined in mixed.php:4
Stack trace:
#0 mixed.php(11): test('hello')
#1 {main}
thrown in mixed.php on line 4

如果我注释掉对 test() 的调用,代码 运行 没问题,所以显然我至少可以在函数声明中使用混合参数类型。

我知道 gettype() 等内置 PHP 函数可以采用混合参数,但我不知道它们是否在内部使用严格类型化。

我看到 "mixed" 也在 PHP documentation 中用作伪类型,所以我可能会误解 "mixed" 作为 [=31] 的目的=] 关键字,但我在这里看到的至少向我暗示它是一个合法的关键字。我只是以不适合的方式使用它吗?

最后,我意识到我可以通过简单地不指定参数类型来规避所有这一切,但我希望通过指定所有参数和 return 类型来保持一致。

谢谢,如果我可以提供任何其他信息,请告诉我。

FYI mixed is not a Type. (Refer to the Documentation). It is only a pseudo type: a Hint that any Type might be passed to or returned from a Method... or perhaps for a variable which was loosely typed as mixed for any reason...

与 C# 不同,您要实现的目标在 PHP 中可能很棘手,尤其是 将 strict_types 设置为 true

但是,您可以在没有严格类型化的情况下实现几乎相似的效果 - 在这种情况下,您的方法可以接受任何类型,只要您不提供任何类型提示。虽然对于 C# 程序员来说,这很糟糕 - 然而,那是 PHP 的精华。

为了表明该函数也接受 null,?-operator 也为此工作,如 http://php.net/manual/de/functions.returning-values.php#functions.returning-values.type-declaration

中所述

但这仅在代码不需要向后兼容时才可用,因为此功能仅在 PHP >= 7.1 上可用 正如您在 https://wiki.php.net/rfc/mixed-typehint 上看到的那样,RFC 用于为类型提示添加混合。所以实际上似乎没有机会为接受更多一种类型的参数定义正确的类型提示。

所以 phpDoc 注释可能是一个解决方案(而且它还向后兼容)。 示例:

/**
* Functiondescription
* @author FSharpN00b
* @param mixed $s
* @return mixed
**/
function test ($s){
    return $s;
}

2021 年更新

混合类型已在 PHP8 中引入。它可以完全按照问题中所示使用。