我定义了这样一个函数:
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)
{}
这将调用自动加载器,该自动加载器将尝试查找int
和string
类的类定义,而这些类显然不存在
这背后的理由很简单。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;
}
...
}