我在一个自定义函数中尝试PHP的mixed类型,但是这个错误让我很困惑(标点符号是我的):
TypeError:传递给()的参数1必须是
mixed,string给定的实例。
下面的一些(示例)代码导致错误消息,并说明了我希望实现的目标。下面是一些TLDR的进一步解释。但是,我认为mixed是一些PHP本机函数(例如字符串函数)的参数类型,并且希望在自定义函数中也这样做。
如何显式地指定函数参数是多类型/混合/任意?
代码
<?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非常陌生,但我尝试的是“新”显式系统。我正在使用PHP7.x,但我认为这是在PHP5.0中引入的。我喜欢TypeScript语言的可选类型系统,并且最初假设mixed的工作方式与TypeScript中的类型any相同。关于混合的PHP文档加强了这一假设,因为它指出:
混合表示参数可以接受多种(但不一定是所有)类型。
但在收到此错误后,似乎mixed完全不同了。这是否适用于具有混合类型值的数组?
发布于 2016-12-21 16:47:26
要实现您想要的结果,只需省略mixed而不指定类型提示即可。PHP ,而不是,有一个语言关键字来显式指定一个参数,可以是不同的类型。
注意,mixed在文档中被命名为关键字,但它不是'language关键字‘,而是仅在PHPDocs中的关键字。array|object、number、void和其他伪类型也是如此。您可以在代码中使用的实际类型在PHP中名为primitives,请参阅下面的文档摘录。
PHP代码中允许的类型提示
以下是允许使用它们的类型和最低PHP版本:
类/接口名-PHP5.0.0 self -PHP5.0.0 数组-PHP5.1.0 可调用-PHP5.4.0 bool -PHP7.0.0 浮动-PHP7.0.0 int -PHP7.0.0 字符串-PHP7.0.0 混合-PHP8.0.0 静态-PHP8.0.0(仅用于返回类型)
PHP8.0还引入了具有以下语法的联合类型:bool|string,它将允许布尔值或字符串。(rfc)
警告:integer和boolean不能用作类型提示
来源:http://php.net/manual/en/functions.arguments.php#functions.arguments.type-declaration
允许在PHPdoc注释中输入
PHP原语类型
字符串一段未指定长度的文本。 、int或整数:一个整数,它可以是正整数,也可以是负数。 浮点实数或十进制数,可以是正数,也可以是负数。 bool或bool只能包含状态‘true’或‘false’的变量。 数组未知类型变量的集合。可以指定数组成员的类型,有关更多信息,请参阅关于数组的章节。 资源文件处理程序或其他系统资源,如PHP手册中所述。 空包含或返回的值实际上为空。这种类型不应与void混淆,后者指的是变量或值的完全缺失(通常与@ be标记一起使用)。 可调用的--可以通过变量传递的函数或方法,有关可调用性的更多信息,请参见手册。
关键词(非PHP本机)
混合A值可以从字面上说是任何类型;文档的作者无法预测它的类型。 --这不是您要寻找的值。与此类型关联的标记不会有意返回任何内容。关联元素返回的任何内容都是偶然的,不需要依赖。 对象返回任何类的对象, false或true返回显式布尔值;通常在方法返回‘false’或某些重要内容时使用。 self --使用该类型的类的对象,如果继承,它仍将表示最初定义它的类。 静态--使用此值的类的对象,如果继承它将表示子类。(请参阅PHP手册中的后期静态绑定)。 $this这个精确的对象实例,通常用来表示一个fluent接口。
来源:https://www.phpdoc.org/docs/latest/guides/types.html#primitives
更新2021
https://stackoverflow.com/questions/41267772
复制相似问题