PHP 7 是否支持资源的严格类型?如果是这样,如何?
例如:
declare (strict_types=1);
$ch = curl_init ();
test ($ch);
function test (resource $ch)
{
}
上面会给出错误:
致命错误:未捕获的类型错误:传递给 test() 的参数 1 必须是资源的实例,给定的资源
$ch
上的var_dump显示它是资源(4,curl),手册说curl_init ()
返回资源。
是否可以严格键入test()
函数以支持$ch variable
?
PHP 没有资源的类型提示,因为
没有添加资源的类型提示,因为这会阻止从资源移动到现有扩展的对象,有些人已经这样做了(例如 GMP)。
但是,您可以在函数/方法主体中使用is_resource()
来验证传递的参数并根据需要对其进行处理。可重用的版本将是这样的断言:
function assert_resource($resource)
{
if (false === is_resource($resource)) {
throw new InvalidArgumentException(
sprintf(
'Argument must be a valid resource type. %s given.',
gettype($resource)
)
);
}
}
然后,您可以在代码中像这样使用它:
function test($ch)
{
assert_resource($ch);
// do something with resource
}
resource
不是一个有效的类型,因此根据旧的 PHP/5 类型提示,它被假定为类名。但curl_init()
不会返回对象实例。
据我所知,没有办法指定资源。它可能不是那么有用,因为并非所有资源都是相同的:fopen()
生成的资源对oci_parse()
毫无用处。
如果要检查函数体中的资源,可以使用 get_resource_type()(与 is_resource() 一起防止错误),如下所示:
is_resource($ch) && get_resource_type($ch) === 'curl'
<小时 />从 PHP/8.0 开始,curl_init()
返回一个对象,因此您现在可以CurlHandle
用作类型提示,