PHP混合类型与Typescript任意

问题描述 投票:4回答:2

我在自定义函数中尝试PHP的mixed类型,但是这个错误让我感到难过(标点符号是我的):

TypeError:传递给<functionName>()的参数1必须是给定的mixedstring的实例。

下面的一些(示例)代码导致错误消息,并说明了我希望实现的目标。下面是一些TLDR的进一步解释。但basicall我看到mixed作为PHP的一些本机函数的参数类型(例如is_string函数),并希望在自定义函数中执行相同操作。

如何明确指定函数参数是multitype / mixed / any?

<?php
    function echoMixed(mixed $input) {
        if (!is_array($input)) {
            echo mixed;
        } else {
            // For arrays echo each element using recursive call.
            foreach($input as $current) {
                echoMixed($current);
            }
        }
    }
    echoMixed('test'); // <-- This results in the error.
    echoMixed(['test1', 'test2']);
?>

TLDR

我是PHP的新手,但正在尝试'新'显式类型系统。我使用的是PHP 7.x,但我认为这是在PHP 5.0中引入的。我喜欢TypeScript语言的可选输入系统,最初假设mixed的工作原理与TypeScript中的any类型相同。 PHP documentation on mixed只强化了这一假设,因为它指出:

mixed表示参数可以接受多个(但不一定是所有)类型。

但是在收到这个错误后,似乎mixed是完全不同的东西。这是用于具有混合类型的值的数组吗?

php php-7 type-systems typing
2个回答
9
投票

为了实现你想要的你只需要省略mixed而不指定typehint。 PHP没有语言关键字来明确指定参数可以是不同的类型。

请注意,mixed在文档中被命名为关键字,但它不是“语言关键字”,而只是PHPDocs中的关键字。 array|objectnumbervoid和其他伪类型也是如此。您可以在代码中使用的实际类型在PHP中命名为primitives,请参阅以下文档摘录。


Allowed typehints in PHP code

以下是允许的类型和使用它们的最低PHP版本:

类/接口名称 - PHP 5.0.0

自我 - PHP 5.0.0

数组 - PHP 5.1.0

可调用 - PHP 5.4.0

bool - PHP 7.0.0

float - PHP 7.0.0

int - PHP 7.0.0

string - PHP 7.0.0

警告:integerboolean不能用作typehints

资料来源:http://php.net/manual/en/functions.arguments.php#functions.arguments.type-declaration


Allowed types in PHPdoc comments

PHP原始类型

string一段未指定长度的文本。

int或整数整数,可以是正数也可以是负数。

float一个实数或十进制数,可以是正数也可以是负数。

bool或boolean一个只能包含状态'true'或'false'的变量。

array一组未知类型的变量。可以指定数组成员的类型,有关更多信息,请参阅有关数组的章节。

资源PHP手册中描述的文件处理程序或其他系统资源。

null包含或返回的值实际上为null。不要将此类型与void混淆,后者是完全没有变量或值(通常与@return标记一起使用)。

callable可以由变量传递的函数或方法,有关callables的更多信息,请参阅PHP手册。

关键字(非PHP原生)

混合这种类型的值可以是字面上的任何东西;文档的作者无法预测它将是哪种类型。

void这不是您要寻找的价值。与此类型关联的标记不会有意返回任何内容。相关元素返回的任何内容都是偶然的,不能依赖。

object返回任何类的对象,

false或true返回显式布尔值;通常在方法返回'false'或后果时使用。

self使用此类型的类的对象,如果继承,它仍将表示最初定义它的类。

static消耗此值的类的对象,如果继承,则表示子类。 (参见PHP手册中的后期静态绑定)。

$ this这个确切的对象实例,通常用于表示流畅的界面。

资料来源:https://www.phpdoc.org/docs/latest/guides/types.html#primitives


0
投票

你必须使用$current来使用那个foreach

© www.soinside.com 2019 - 2024. All rights reserved.