函数参数中的awkward PHP类型错误

时间:2014-08-27 10:47:09

标签: php types

我已经定义了这样的函数:

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

我遇到了这种错误:

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

任何帮助?

4 个答案:

答案 0 :(得分:4)

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

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

但是你不能输入提示原语/标量或资源类型:

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

这将调用自动加载器,该术语将试图找到intstring类的类定义,这显然不存在。
这背后的基本原理很简单。 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)

来自Type Hinting

的文档
  

类型提示不能与标量类型(如int或string)一起使用。资源和特征也是不允许的。

这就是你收到错误的原因

答案 3 :(得分:0)

您可以这样检查

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