函数()必须是字符串的一个实例,在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引入了更多的函数数据类型声明,并且前面提到的链接已经被移至函数参数:类型声明。 从该页面:

有效的类型

  • 类/接口名称 :参数必须是给定类或接口名称的实例。 (自PHP 5.0.0起)
  • self :参数必须是与定义方法相同的类的实例。 这只能用于类和实例方法。 (自PHP 5.0.0起)
  • 数组 :参数必须是数组。 (自PHP 5.1.0起)callable参数必须是有效的可调用的。 PHP 5.4.0
  • bool :参数必须是布尔值。 (自PHP 7.0.0起)
  • float :参数必须是浮点数。 (自PHP 7.0.0起)
  • int :参数必须是整数。 (自PHP 7.0.0起)
  • 字符串 :参数必须是字符串。 (自PHP 7.0.0起)
  • iterable :参数必须是数组或实例的Traversable。 (自PHP 7.1.0起)
  • 警告

    不支持上述标量类型的别名。 相反,它们被视为类或接口名称。 例如,使用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?