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


How to use mixed parameter type in my own functions?

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

我的代码如下。

<?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文档中也被用作伪类型,所以我可能会误解"mixel"作为PHP关键字的目的,但我在这里看到的至少意味着它是一个合法的关键字。我只是以一种不适合的方式使用它吗?

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

谢谢你,如果我能提供任何额外的信息,请告诉我。

仅供参考混合不是类型。(请参阅文档)。这只是一个伪类型任何类型都可能被传递到方法或从方法返回的提示。。。或者对于一个由于任何原因被松散地类型化为混合的变量

与C#不同,在PHP中,您试图实现的目标可能很棘手,尤其是在strict_types设置为true的情况下。

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

更新2021

PHP8中引入了混合型。它可以完全按照问题中所示的方式使用。

要指示函数也接受null-操作员也为此工作,如上所述http://php.net/manual/de/functions.returning-values.php#functions.returning-values.type声明

但这只有在代码不向后兼容的情况下才可用,因为此功能仅在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;
}