PHP 7 - PHP 7 和严格的“资源”类型


php 7 - PHP 7 and strict "resource" types

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用作类型提示,