PHP的混合类型与打字稿的任何类型

时间:2016-12-21 16:41:53

标签: php php-7 type-systems typing

我在自定义函数中尝试了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很陌生,但正在尝试新的&#39;显式类型系统。我使用的是PHP 7.x,但我认为这是在PHP 5.0中引入的。我喜欢TypeScript语言的可选输入系统,最初假定mixed的工作方式与TypeScript中的类型any相同。 PHP documentation on mixed只强化了这一假设,因为它表明:

  

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

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

2 个答案:

答案 0 :(得分:9)

要实现您想要的功能,您只需省略mixed而不指定类型提示。 PHP NOT 有一个语言关键字来明确指定一个参数可以是不同的类型。

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

PHP代码中允许的类型提示

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

  

类/接口名称 - PHP 5.0.0

     

自我 - PHP 5.0.0

     

数组 - PHP 5.1.0

     

可调用 - PHP 5.4.0

     

bool - PHP 7.0.0

     

浮动 - PHP 7.0.0

     

int - PHP 7.0.0

     

字符串 - PHP 7.0.0

警告integerboolean不能用作打字提示

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

PHPdoc注释中的允许类型

PHP原始类型

  

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

     

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

     

float 可以是正数或负数的实数或小数。

     

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

     

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

     

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

     

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

     

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

关键字(非PHP原生)

  

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

     

void 这不是您要查找的值。与此类型关联的标记不会有意返回任何内容。   相关元素返回的任何内容都是偶然的,而不是   可靠的。

     

object 返回任何类的对象,

     

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

     

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

     

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

     

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

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

答案 1 :(得分:0)

您必须使用$current来使用该foreach