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

66

PHP 7是否支持资源的严格类型?如果是,该如何实现?

例如:

    declare (strict_types=1);

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

    function test (resource $ch)
    {

    }
以上代码将报错:

Fatal error: Uncaught TypeError: Argument 1 passed to test() must be an instance of resource, resource given

$ch进行var_dump(),发现它是resource(4, curl),并且手册上说curl_init ()会返回一个资源(resource)。
是否有可能在test()函数中使用强类型支持$ch变量
2个回答

84

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
}

19

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接