Get resource type: примеры (PHP)

Использование get_resource_type для определения типа ресурса
Раздел: Работа с ресурсами
get_resource_type(resource $resource): string

Описание функции get_resource_type

Функция get_resource_type() возвращает тип переданного ресурса. В PHP ресурс (resource) — это специальная переменная, содержащая ссылку на внешний ресурс, такой как файл, соединение с базой данных, изображение GD и т.д.

Когда используется

Функция применяется для отладки, логирования или условной обработки разных типов ресурсов. Это полезно, когда код работает с ресурсами из различных расширений и необходимо определить их природу.

Аргументы функции

Функция принимает один обязательный параметр:

  • $resource — ресурс, тип которого необходимо определить. Если передан нересурс, в PHP 8 будет выброшена ошибка TypeError.

Краткие примеры использования

Пример с файловым дескриптором
$file = fopen('test.txt', 'r');
echo get_resource_type($file);
fclose($file);
stream
Пример с соединением cURL
$ch = curl_init('http://example.com');
echo get_resource_type($ch);
curl_close($ch);
curl
Пример с изображением GD
$image = imagecreate(100, 100);
echo get_resource_type($image);
imagedestroy($image);
gd
Пример с MySQLi
$conn = mysqli_connect('localhost', 'user', 'pass');
echo get_resource_type($conn);
mysqli_close($conn);
mysql link

Похожие функции в PHP

gettype()

Возвращает тип любой переменной. Для ресурсов вернет строку 'resource' или 'resource (closed)' для закрытых ресурсов (PHP 8.2+), но не уточняет тип ресурса.

$file = fopen('test.txt', 'r');
echo gettype($file); // resource
fclose($file);
echo gettype($file); // resource (closed)
is_resource()

Проверяет, является ли переменная ресурсом. Возвращает true или false. Более предпочтительна для проверки перед вызовом get_resource_type().

$var = fopen('php://memory', 'r');
if (is_resource($var)) {
    echo 'Это ресурс';
}
Когда что использовать

get_resource_type() нужна для точного определения типа ресурса. is_resource() — для простой проверки. gettype() в контексте ресурсов менее информативна.

Аналоги в других языках

Get resource type в Python

В Python нет прямого аналога. Тип объекта определяется с помощью type() или isinstance(). Файловые дескрипторы — это объекты.

f = open('test.txt', 'r')
print(type(f))
print(isinstance(f, io.IOBase))
f.close()
<class '_io.TextIOWrapper'>
True
JavaScript (Node.js)

В Node.js существуют ресурсы (например, дескрипторы файлов), но они инкапсулированы в объекты. Для проверки используется typeof и конструктор.

const fs = require('fs');
const stream = fs.createReadStream('file.txt');
console.log(stream.constructor.name);
console.log(stream instanceof fs.ReadStream);
ReadStream
true

Get resource type в MySQL

В SQL нет концепции ресурсов, аналогичной PHP. Соединения с БД управляются на уровне драйверов и клиентских библиотек.

Типичные ошибки

Передача нересурса (PHP 8+)

В PHP 8 и выше передача значения, не являющегося ресурсом, вызывает TypeError.

$not_resource = 'string';
echo get_resource_type($not_resource);
TypeError: get_resource_type(): Argument #1 ($resource) must be of type resource, string given
Работа с закрытым ресурсом

В PHP 8.2+ функция для закрытого ресурса вернет 'Unknown'. В более ранних версиях могло возникать предупреждение или ложный результат.

$file = fopen('test.txt', 'r');
fclose($file);
echo get_resource_type($file);
Unknown
Использование после уничтожения

Ошибка при попытке использовать ресурс после удаления с помощью unset или сборки мусора.

$ch = curl_init();
unset($ch);
// echo get_resource_type($ch); // Приведет к ошибке: переменная не определена

Изменения в последних версиях PHP

PHP 8.0: Строгая типизация

Функция теперь ожидает аргумент типа resource. Передача нересурса вызывает TypeError, а не предупреждение.

PHP 8.2: Возврат 'Unknown' для закрытых ресурсов

Для закрытых ресурсов функция возвращает строку 'Unknown'. Ранее поведение могло быть неопределенным.

// Поведение в PHP 8.2+
$res = fopen('php://memory', 'r');
fclose($res);
var_dump(get_resource_type($res));
string(7) "Unknown"

Расширенные примеры использования

Обработка разных типов ресурсов в условии
Пример php
function processResource($resource) {
    if (!is_resource($resource)) {
        throw new InvalidArgumentException('Ожидается ресурс');
    }

    $type = get_resource_type($resource);

    switch ($type) {
        case 'stream':
            return 'Обработка потока';
        case 'curl':
            return 'Обработка cURL';
        case 'gd':
            return 'Обработка изображения';
        default:
            return 'Неизвестный тип ресурса: ' . $type;
    }
}

$file = fopen('php://temp', 'r+');
echo processResource($file); // Обработка потока
fclose($file);
Работа с сокетами
Пример php
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket !== false) {
    echo 'Тип ресурса сокета: ' . get_resource_type($socket);
    socket_close($socket);
}
Тип ресурса сокета: Socket
Определение типа ресурса базы данных
Пример php
// Для расширения mysql (устаревшее)
if (function_exists('mysql_connect')) {
    $link = mysql_connect();
    echo get_resource_type($link); // mysql link
    mysql_close($link);
}

// Для расширения mysqli (объектный стиль не возвращает ресурс)
$mysqli = new mysqli('localhost', 'user', 'pass');
// $mysqli - объект, а не ресурс
var_dump(is_resource($mysqli)); // bool(false)
Логирование ресурсов
Пример php
function logResource($resource, string $message) {
    $type = is_resource($resource) ? get_resource_type($resource) : 'not a resource';
    error_log("[$type] $message");
}

$ch = curl_init();
logResource($ch, 'Инициализирован cURL');
curl_close($ch);
Проверка before/after закрытия (PHP 8.2+)
Пример php
$handle = xml_parser_create();
$typeOpen = get_resource_type($handle);
xml_parser_free($handle);
$typeClosed = get_resource_type($handle);

echo "Открыт: $typeOpen, Закрыт: $typeClosed";
Открыт: xml, Закрыт: Unknown
Использование с пользовательскими расширениями

Если модуль регистрирует собственный тип ресурса, get_resource_type() вернет его имя.

Пример php
// Пример с модулем, регистрирующим тип 'my_custom_resource'
// $customRes = my_ext_create_resource();
// echo get_resource_type($customRes); // my_custom_resource

PHP get_resource_type function comments

En
Get resource type Returns the resource type