我已经定义了这样的函数:
private function mediaExist(string $entry) { ...
我遇到了这种错误:
... must be an instance of string, string given, called in ...
任何帮助?
答案 0 :(得分:4)
PHP类型提示仅适用于类或数组:
function foo(array $bar, stdClass $object)
{//fine
}
但是你不能输入提示原语/标量或资源类型:
function bar(int $num, string $str)
{}
这将调用自动加载器,该术语将试图找到int
和string
类的类定义,这显然不存在。
这背后的基本原理很简单。 PHP是一种松散类型的语言,数字字符串可以通过type-juggling转换为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');
}
}
就 resources 而言(像文件处理程序这样的东西),它同样容易修复:
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-blocks和一个不错的IDE。当您调用函数/方法时,IDE将使用doc-blocks来告诉您期望的类型。程序员的工作是确保满足这些标准:
/**
* 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 = '')
{
}
答案 1 :(得分:1)
如果你omit the string
type constraint, it should work。 PHP在尝试推断你传递它的字符串文字的类型方面遇到了麻烦,因此它假定无论它是什么,它可能不是你正在寻找的东西 - 恰好是{ {1}}。
答案 2 :(得分:1)
答案 3 :(得分:0)
您可以这样检查
function foo($string) {
if (!is_string($string)) {
trigger_error('No, you fool!');
return;
}
...
}