函数参数中出现尴尬的PHP类型错误


Awkward PHP type error in function arguments

我定义了这样一个函数:

   private function mediaExist(string $entry) { ...

我得到了这种类型的错误:

   ... must be an instance of string, string given, called in ...

有什么帮助吗?

PHP类型提示仅适用于类或数组:

function foo(array $bar, stdClass $object)
{//fine
}

但您不能键入提示基元/标量或资源类型:

function bar(int $num, string $str)
{}

这将调用自动加载器,该自动加载器将尝试查找intstring类的类定义,而这些类显然不存在
这背后的理由很简单。PHP是一种松散类型的语言,可以通过类型转换将数字字符串转换为int或float:

$foo = '123';
$bar = $foo*2;//foo's value is used as an int -> 123*2

引入类型提示是为了提高该语言的OO功能:类/接口应该能够通过使用(除其他外)类型提示来强制执行约定。

如果您想确保给定的值是字符串,可以使用强制转换或类型检查函数:

function foo($string)
{
    $sureString = (string) $string;//cast to string
    if ($sureString != $string)
    {//loose comparison, if they are not equal, the argument could not be converted to a string reliable
        throw new InvalidArgumentException(__FUNCTION__.' expects a string argument, '.get_type($string).' given');
    }
}

资源而言(比如文件处理程序),修复起来同样容易:

function foobar(/* resource hint is not allowed */ $resource)
{
    if (!is_resource($resource))
    {
        throw new InvalidArgumentException(
            sprintf(
                '%s expects a resource, %s given',
                __FUNCTION__,
                get_type($resource)
            );
        );
    }
}

最后,在开发一个大型PHP项目时,最好使用doc块和一个不错的IDE。当您调用一个函数/方法时,IDE将使用doc块来告诉您需要什么类型。程序员的工作是确保这些标准得到满足:

/**
 * Some documentation: what this function does, and how the arguments
 * are being used
 * @param array $data
 * @param string $key
 * @param string $errorMsg = ''
 * @return mixed
 * @throws InvalidArgumentException
 **/
function doStuff(array $data, $key, $errorMsg = '')
{
}

如果省略string类型约束,它应该可以工作。PHP在尝试推断您传递的字符串文字的类型时遇到了问题,因此它假设无论它是什么,它都可能不是您要查找的东西——它恰好是string

来自类型提示的文档

类型提示不能与int或string等标量类型一起使用。资源和特性也不允许。

这就是为什么您得到错误

您可以通过这种方式检查

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