Get resource type: примеры (PHP)
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
$ch = curl_init('http://example.com');
echo get_resource_type($ch);
curl_close($ch);curl
$image = imagecreate(100, 100);
echo get_resource_type($image);
imagedestroy($image);gd
$conn = mysqli_connect('localhost', 'user', 'pass');
echo get_resource_type($conn);
mysqli_close($conn);mysql link
Похожие функции в PHP
Возвращает тип любой переменной. Для ресурсов вернет строку 'resource' или 'resource (closed)' для закрытых ресурсов (PHP 8.2+), но не уточняет тип ресурса.
$file = fopen('test.txt', 'r');
echo gettype($file); // resource
fclose($file);
echo gettype($file); // resource (closed)Проверяет, является ли переменная ресурсом. Возвращает 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
В 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 и выше передача значения, не являющегося ресурсом, вызывает 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
Функция теперь ожидает аргумент типа resource. Передача нересурса вызывает TypeError, а не предупреждение.
Для закрытых ресурсов функция возвращает строку 'Unknown'. Ранее поведение могло быть неопределенным.
// Поведение в PHP 8.2+
$res = fopen('php://memory', 'r');
fclose($res);
var_dump(get_resource_type($res));string(7) "Unknown"
Расширенные примеры использования
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);$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket !== false) {
echo 'Тип ресурса сокета: ' . get_resource_type($socket);
socket_close($socket);
}Тип ресурса сокета: Socket
// Для расширения 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)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);$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() вернет его имя.
// Пример с модулем, регистрирующим тип 'my_custom_resource'
// $customRes = my_ext_create_resource();
// echo get_resource_type($customRes); // my_custom_resource