如何解决“传递给my_function()的参数1必须是string的一个实例,在PHP 7之前给出的string?

这是我的代码:

function phpwtf(string $s) { echo "$s\n"; } phpwtf("Type hinting is da bomb"); 

这导致了这个错误:

可捕获的致命错误:传递给phpwtf()的参数1必须是string的实例,string给定

它不仅仅是一个小奥维尔人看到PHP识别并拒绝所希望的types。 有五盏灯,该死的。

PHP中string的types提示是什么? 附加考虑到解释到底发生了什么的答案。

概要

错误信息是令人困惑的一个重大原因:

原始types名称不保留在PHP中

以下是所有有效的类声明:

 class string { } class int { } class float { } class double { } 

我的错误是认为错误信息只是指string的基本types – “实例”这个词应该让我暂停。 一个例子来进一步说明:

 class string { } $n = 1234; $s1 = (string)$n; $s2 = new string(); $a = array('no', 'yes'); printf("\$s1 - primitive string? %s - string instance? %s\n", $a[is_string($s1)], $a[is_a($s1, 'string')]); printf("\$s2 - primitive string? %s - string instance? %s\n", $a[is_string($s2)], $a[is_a($s2, 'string')]); 

输出:

$ s1 – 原始string? 是的 – string实例? 没有

$ s2 – 原始string? 无string实例? 是

在PHP中, string可能是一个string除非它实际上是一个string 。 与使用隐式types转换的任何语言一样,上下文就是一切。

在PHP 7之前, types提示只能用于强制对象和数组的types。 标量types不是types可显示的。 在这种情况下,类string的对象是预期的,但是你给它一个(标量) string 。 错误消息可能很有趣,但不应该开始工作。 鉴于dynamic分类系统,这实际上是一种变态的感觉。

您只能手动 “键入提示”标量types:

 function foo($string) { if (!is_string($string)) { trigger_error('No, you fool!'); return; } ... } 

从PHP的手册 :

types提示只能是对象和数组(自PHP 5.1起)types。 传统的int和stringtypes的提示不被支持。

所以你有它。 错误信息是不是真的有帮助,但我给你。

PHP允许“暗示”你提供一个类来指定一个对象。 根据PHP手册,“types提示只能是对象和数组(从PHP5.1开始)types,不支持使用int和string的传统types提示。 错误是因为你select的“string”而引起混淆 – 把“myClass”放在它的位置,错误的读法是不同的:“传递给phpwtf()的参数1必须是myClass的一个实例,

正如其他人已经说过,键入提示目前只适用于对象types。 但是我认为你触发的特定错误可能是在准备即将到来的stringtypesSplString 。

理论上它的行为就像一个string,但是由于它是一个对象,所以会通过对象typesvalidation。 不幸的是,它尚未在PHP 5.3中,可能会在5.4,所以还没有testing过。

从PHP 7.0开始,types声明允许标量types,所以现在可以使用这些types: selfarraycallableboolfloatintstring 。 前三个在PHP 5中可用,但最后四个在PHP 7中是新的。如果使用其他任何东西(例如integerboolean )将被解释为类名。

有关更多信息,请参阅PHP手册 。

从Laravel控制器调用一个函数到一个PHP文件时,我得到这个错误。

几个小时后,我发现这个问题:我在静态函数中使用$ this

我认为在内部块的PHPtypes转换,PHP上的string不是对象,因为我知道:

 <?php function phpwtf($s) { $s = (string) $s; echo "$s\n"; } phpwtf("Type hinting is da bomb"); 

也许不安全和漂亮,但如果你必须:

 class string { private $Text; public function __construct($value) { $this->Text = $value; } public function __toString() { return $this->Text; } } function Test123(string $s) { echo $s; } Test123(new string("Testing"));