函数()必须是字符串的一个实例,在PHP 7之前给出的字符串?
这是我的代码:
function phpwtf(string $s) {
echo "$sn";
}
phpwtf("Type hinting is da bomb");
这导致了这个错误:
可捕获的致命错误:传递给phpwtf()的参数1必须是字符串的实例,字符串是给定的
它不仅仅是一个小型的奥维尔人,可以看到PHP识别并相互拒绝所需的类型。 有五盏灯,该死的。
PHP中字符串的类型提示的等价物是什么? 附加考虑到解释到底发生了什么的答案。
概要
该错误消息令人困惑的原因之一是:
原始类型名称不保留在PHP中
以下是所有有效的类声明:
class string { }
class int { }
class float { }
class double { }
我的错误在于认为错误信息只是指字符串原始类型 - “实例”这个词应该让我停下来。 一个例子来进一步说明:
class string { }
$n = 1234;
$s1 = (string)$n;
$s2 = new string();
$a = array('no', 'yes');
printf("$s1 - primitive string? %s - string instance? %sn",
$a[is_string($s1)], $a[is_a($s1, 'string')]);
printf("$s2 - primitive string? %s - string instance? %sn",
$a[is_string($s2)], $a[is_a($s2, 'string')]);
输出:
$ s1 - 原始字符串? 是的 - 字符串实例? 没有
$ s2 - 原始字符串? 无字符串实例? 是
在PHP中, string
可能是一个string
除非它实际上是一个string
。 与使用隐式类型转换的任何语言一样,上下文就是一切。
在PHP 7之前,类型提示只能用于强制对象和数组的类型。 标量类型不是类型可显示的。 在这种情况下,类string
一个对象是预期的,但是你给它一个(标量) string
。 错误消息可能很有趣,但它不应该开始工作。 鉴于动态分类系统,这实际上会造成某种变态的感觉。
您只能手动“键入提示”标量类型:
function foo($string) {
if (!is_string($string)) {
trigger_error('No, you fool!');
return;
}
...
}
来自PHP的手册:
类型提示只能是对象和数组(自PHP 5.1起)类型。 不支持传统类型int和字符串提示。
所以你有它。 错误信息不是很有帮助,但我给你。
** 2017编辑**
PHP7引入了更多的函数数据类型声明,并且前面提到的链接已经被移至函数参数:类型声明。 从该页面:
有效的类型
警告
不支持上述标量类型的别名。 相反,它们被视为类或接口名称。 例如,使用boolean作为参数或返回类型将需要参数或返回值,该参数或返回值是类或接口布尔的实例,而不是类型bool:
<?php
function test(boolean $param) {}
test(true);
?>
上面的例子将输出:
Fatal error: Uncaught TypeError: Argument 1 passed to test() must be an instance of boolean, boolean given, called in - on line 1 and defined in -:1
最后一个警告对于理解错误“参数必须是字符串类型,给定字符串”非常重要。 由于大多数只有类/接口名称被允许作为参数类型,所以PHP试图找到一个类名“string”,但由于它是原始类型,因此找不到任何类,因此失败并带有这个尴尬的错误。
PHP允许“暗示”你提供一个类来指定一个对象。 根据PHP手册,“类型提示只能是对象和数组(自PHP 5.1起)类型,不支持使用int和string的传统类型提示。” 由于你选择了“字符串”,错误是令人困惑的 - 把“myClass”放在它的位置,并且错误将以不同的方式读取:“传递给phpwtf()的参数1必须是myClass的一个实例,
链接地址: http://www.djcxy.com/p/26601.html上一篇: function() must be an instance of string, string given" prior to PHP 7?
下一篇: How can I remove 3 characters at the end of a string in php?