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

2022-08-30 19:45:12

我想定义一个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() 的调用,代码运行良好,所以显然至少在函数声明中使用混合参数类型是可以的。

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

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

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

谢谢,如果我能提供任何其他信息,请让我知道。


答案 1

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

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

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


答案 2

更新 2021

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


推荐