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

2022-08-30 09:53:07

PHP 7 是否支持对资源进行严格键入?如果是这样,如何?

例如:

    declare (strict_types=1);

    $ch = curl_init ();
    test ($ch);

    function test (resource $ch)
    {

    }

以上将给出错误:

致命错误:未捕获的类型错误:传递给 test() 的参数 1 必须是资源的实例,给定资源

var_dump显示它是 resource(4, curl),手册说返回一个资源。$chcurl_init ()

是否可以严格键入函数来支持 ?test()$ch variable


答案 1

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
}

答案 2

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


推荐