【问题标题】:PHP's mixed type vs Typescript's anyPHP 混合类型 vs Typescript 任意
【发布时间】:2017-05-07 04:07:25
【问题描述】:

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

TypeError: 传递给 () 的参数 1 必须是 mixed、string 的实例。

下面的一些(示例)代码会导致错误消息并说明我希望实现的目标。下面是一些带有进一步解释的 TLDR。但基本上我将mixed 视为一些PHP 原生函数(例如is_string 函数)的参数类型,并希望在自定义函数中做同样的事情。

如何明确指定函数参数是多类型/混合/任意?

代码

<?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 似乎完全不同了。这是否适用于具有混合类型或其他值的数组?

【问题讨论】:

  • 在函数的第二行,我想你的意思是:if (!is_array($input)) {。

标签: php php-7 type-systems typing


【解决方案1】:

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

请注意mixed 在文档中命名为关键字,但它不是“语言关键字”,而是仅在 PHPDocs 中的关键字。 array|object、number、void 和其他伪类型也是如此。您可以在代码中使用的实际类型在 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

混合 - PHP 8.0.0

静态 - PHP 8.0.0(仅用于返回类型)

PHP 8.0 还引入了具有以下语法的联合类型:bool|string,这将允许布尔值或字符串。 (rfc)

警告:integer 和 boolean 不能用作类型提示

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


PHPdoc cmets 中允许的类型

PHP 原始类型

字符串一段未指定长度的文本。

整数或整数一个整数,可以是正数也可以是负数。

float一个实数或小数,可以是正数或负数。

bool 或 boolean 只能包含状态“true”或“false”的变量。

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

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

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

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

关键字(非 PHP 原生)

mixed 这种类型的值实际上可以是任何东西;文档的作者无法预测它将是哪种类型。

void 这不是您要寻找的值。与此类型关联的标签不会有意返回任何内容。 关联元素返回的任何内容都是偶然的,而不是 值得信赖。

object返回任意类的对象,

false 或 true 返回显式布尔值;通常在方法返回“false”或其他结果时使用。

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

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

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

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

2021 年更新

mixed 类型已在PHP8 中引入 static类型已在PHP8中引入

【讨论】:

  • 只是为了添加...函数中未键入的php变量已经“混合”了。
  • 感谢@Crozet!我实际上读过“伪类型”。我会问 PHP 文档人员是否可以添加伪类型的简短说明。例如在 CSS 伪元素中,不是实际元素,但仍然是语言结构/关键字。例如,另一个伪类型 array|object 可以用作 TypeScript 中的实际类型规范 (Union types)。套用 Arthur C .Clarke 的话:“任何足够高级的编程语言都无法与规范区分开来。” :P
  • 我不喜欢它在 php 中实现的方式。我想创建一个严格的库,其中所有内容都应该成为类型提示(如果我没有指定类型,我的 IDE 应该能够警告我)。有时我需要mixed。如果我只是在这里省略了类型,我的 IDE 不知道这是不是有意的。所以它永远无法警告我。有没有我可能不知道的关于 php 方面的讨论?
猜你喜欢
  • 1970-01-01
  • 2021-12-15
  • 1970-01-01
  • 2020-10-23
  • 2020-03-17
  • 2019-06-24
  • 1970-01-01
  • 2017-02-10
  • 2019-07-11
相关资源
最近更新 更多