PHP 7 и строгие типы ресурсов - программирование

PHP 7 и строгие типы ресурсов

Поддерживает ли PHP 7 строгое типирование ресурсов? Если да, то как?

Например:

    declare (strict_types=1);

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

    function test (resource $ch)
    {

    }

Вышеприведенное даст ошибку:

Неустранимая ошибка: Uncaught TypeError: аргумент 1, переданный test(), должен быть экземпляром ресурса, заданного ресурсом

. var_dump на $ch показывает, что он является ресурсом (4, curl), и в руководстве говорится, что curl_init () возвращает ресурс.

Можно ли строго ввести функцию test() для поддержки $ch variable?

4b9b3361

Ответ 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().