首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何解决PHP 7之前的“必须是字符串,字符串给定”的实例?

如何解决PHP 7之前的“必须是字符串,字符串给定”的实例?
EN

Stack Overflow用户
提问于 2010-11-05 03:53:17
回答 8查看 127.9K关注 0票数 225

这是我的代码:

代码语言:javascript
复制
function phpwtf(string $s) {
    echo "$s\n";
}
phpwtf("Type hinting is da bomb");

导致此错误:

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

看到PHP同时识别和拒绝所需的类型不仅仅是一点奥威尔式的。有五盏灯,该死。

在PHP中,对字符串的类型暗示相当于什么?额外考虑的答案,确切地解释了这里发生了什么。

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2010-11-05 04:09:38

在PHP7之前,类型暗示只能用于强制对象和数组的类型。标量类型不是类型障碍.在本例中,需要类string的一个对象,但您要给它一个(标量) string。错误信息可能很有趣,但它一开始就不起作用。考虑到动态类型系统,这实际上具有某种反常的意义。

只能手动“输入提示”标量类型:

代码语言:javascript
复制
function foo($string) {
    if (!is_string($string)) {
        trigger_error('No, you fool!');
        return;
    }
    ...
}
票数 214
EN

Stack Overflow用户

发布于 2010-11-05 04:08:45

在编写此答复时,PHP手册中:

类型提示只能是对象和数组(因为PHP5.1)类型。不支持使用int和string提示的传统类型。

所以你有了。错误信息并没有真正的帮助,不过,我给出了这个信息。

** 2017编辑**

PHP7引入了更多的函数数据类型声明,上述链接已移到函数参数:类型声明中。从这一页:

有效类型

  • 类/接口名:参数必须是给定类或接口名称的实例。(自PHP 5.0.0起)
  • self:参数必须是与定义方法的类相同的实例。这只能在类和实例方法上使用。(自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起)
  • 字符串:参数必须是字符串。(自PHP 7.0.0起)
  • 可迭代:参数必须是数组或可遍历实例。(自PHP 7.1.0以来)

警告 不支持上述标量类型的别名。相反,它们被视为类或接口名称。例如,使用布尔值作为参数或返回类型将需要一个参数或返回值,该参数或返回值是类或接口布尔值的实例,而不是bool类型:上面的示例将输出:致命错误: Uncaught :通过测试()的参数1必须是布尔值、给定的布尔值、在行1中调用并在-:1中定义的实例。

最后一个警告对于理解错误“参数必须类型为string,string给定”具有重要意义;由于大多数情况下只允许类/接口名称作为参数类型,PHP试图定位一个类名"string",但由于它是一个原始类型而找不到,因此在这个尴尬的错误中失败。

票数 28
EN

Stack Overflow用户

发布于 2010-11-05 04:09:42

PHP允许提供类来指定对象的“暗示”。根据PHP手册,“类型提示只能是对象和数组(因为PHP5.1)类型,不支持使用int和string提示的传统类型。”这个错误令人困惑,因为您选择了" string“--将" myClass”放在它的位置,并且错误将以不同的方式读取:“传递给phpwtf()的参数1必须是myClass的一个实例,字符串给定”。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4103480

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档