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

FSh*_*00b 12 php parameters mixed types strict

我想定义一个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');
?>
Run Code Online (Sandbox Code Playgroud)

当我运行此代码时,我得到以下内容.

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
Run Code Online (Sandbox Code Playgroud)

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

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

我看到"混合"在PHP 文档中也被用作伪类型,所以我可能误解了"混合"作为PHP关键字的目的,但我在这里看到的至少暗示我这是合法的关键词.我只是以一种不适合的方式使用它吗?

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

谢谢,如果我能提供任何其他信息,请告诉我.

Poi*_*oiz 14

FYI 混合不是一种类型.(请参阅文档).它只是一个伪类型:一个提示,任何Type都可以传递给Method或从Method返回...或者也许是因为任何原因而被松散键入混合的变量...

与C#不同,您尝试实现的内容在PHP中可能会非常棘手,特别是在strict_types设置为true的情况下.

但是,如果没有严格打字,您可以获得几乎相似的效果 - 在这种情况下,只要您不提供任何类型提示,您的方法就可以接受任何类型.虽然对于C#程序员来说,这很糟糕 - 然而,这就是PHP的结晶.


小智 8

2021 年更新

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

  • 关于混合类型的 PHP 文档链接:https://www.php.net/manual/en/language.types.declarations.php#language.types.declarations.mixed (2认同)