W3docs

get_resource_type()

Функция get_resource_type() в PHP возвращает string с типом переданного ресурса. Узнайте синтаксис, примеры и особенности PHP 8.

Введение

get_resource_type() — встроенная функция PHP, которая возвращает string с именем типа ресурса, хранящегося в переменной, — например, "stream" для открытого файла или "process" для запущенного внешнего процесса.

Ресурс — это особый тип переменной PHP, хранящей ссылку на нечто, существующее за пределами PHP: открытый файл, сетевой сокет, изображение, формируемое в памяти, дочерний процесс и т. д. Поскольку базовый object непрозрачен, напрямую его не осмотреть. get_resource_type() даёт читаемую метку, описывающую что именно представляет ресурс, — это удобно для логирования, отладки и написания функций, принимающих несколько видов ресурсов, но обрабатывающих лишь некоторые из них.

На этой странице рассмотрены синтаксис, string-значения типов ресурсов, которые вы реально встретите, важная оговорка для PHP 8 (многие бывшие «ресурсы» теперь являются объектами) и правила безопасного использования функции.

Синтаксис

get_resource_type(resource $handle): string

Функция принимает один параметр:

  • $handle — ресурс, тип которого нужно получить. Должен быть активным значением ресурса.

Возвращает строку в нижнем регистре, идентифицирующую тип ресурса. Если передать что-либо, не являющееся ресурсом, PHP 8 выбросит TypeError (в PHP 7 выдавалось предупреждение и возвращался null).

Базовый пример

Наиболее распространённый ресурс для проверки — дескриптор файла/потока, полученный через fopen():

<?php
$file = fopen("php://memory", "w+");

echo get_resource_type($file), PHP_EOL; // stream

fclose($file);
?>

Вывод:

stream

php://memory — реальный, всегда доступный поток, поэтому этот пример работает везде без необходимости наличия файла на диске.

Распространённые string-значения типов ресурсов

Разные функции создают ресурсы разных типов. Вот несколько, которые вы скорее всего встретите:

<?php
$file = fopen("php://memory", "r");
echo get_resource_type($file), PHP_EOL;   // stream

$ctx = stream_context_create();
echo get_resource_type($ctx), PHP_EOL;    // stream-context

$proc = proc_open("echo hi", [], $pipes);
echo get_resource_type($proc), PHP_EOL;   // process
proc_close($proc);
?>

Вывод:

stream
stream-context
process

Конкретные string-значения задаются расширением, создавшим ресурс, поэтому это стабильные имена, пригодные для сравнения ("stream", "curl" в старых версиях PHP, "gd" для старых дескрипторов изображений и т. д.).

Важно: PHP 8 превратил многие ресурсы в объекты

Это наиболее важный подводный камень. Начиная с PHP 8.0 несколько расширений перевели свои старые типы ресурсов на настоящие объекты. Дескрипторы cURL, соединения MySQLi, изображения GD и прочие больше не являются ресурсами — поэтому get_resource_type() теперь выбрасывает TypeError при работе с ними:

<?php
$ch = curl_init();           // PHP 8: returns a CurlHandle object, not a resource
echo gettype($ch), PHP_EOL;  // object

// get_resource_type($ch);   // TypeError: must be of type resource, CurlHandle given
?>

Вывод:

object

Поэтому старые руководства, в которых get_resource_type($curlHandle) возвращает "curl", устарели. Для дескрипторов на основе объектов используйте get_class() / instanceof. Файловые потоки из fopen() по-прежнему являются настоящими ресурсами, поэтому они остаются надёжным примером.

Защита от передачи не-ресурсов

Поскольку передача не-ресурса вызывает TypeError в PHP 8, предварительно проверяйте значение с помощью is_resource(), если оно может оказаться закрытым или равным false:

<?php
$file = fopen("php://memory", "r");
fclose($file);

if (is_resource($file)) {
    echo get_resource_type($file);
} else {
    echo "Not an active resource";
}
?>

Вывод:

Not an active resource

После fclose() переменная становится закрытым ресурсом: is_resource() возвращает false, а gettype() сообщает "resource (closed)". Такая защита позволяет избежать фатального TypeError.

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

  • Валидация входных данных функции, которая должна принимать лишь определённый вид ресурса (например, отклонять всё, что не является "stream").
  • Отладка / логирование — запись того, что собой представляет ресурс при поиске ошибки.
  • Разветвление логики в библиотеках, по-разному обрабатывающих несколько типов ресурсов.

Для простой проверки «является ли это вообще ресурсом?» предпочитайте is_resource(); к get_resource_type() обращайтесь лишь тогда, когда нужно различить какой именно это ресурс.

Заключение

get_resource_type() возвращает string, описывающую тип ресурса, хранящегося в переменной, что полезно для валидации, отладки и ветвления по типу. Помните об изменениях в PHP 8: многие дескрипторы, которые раньше были ресурсами (cURL, MySQLi, GD), теперь являются объектами и вызовут TypeError — для них используйте get_class(). Комбинируйте get_resource_type() с is_resource(), чтобы никогда не вызывать её на закрытом или недопустимом значении.

Практика

Практика
Что делает функция get_resource_type() в PHP?
Что делает функция get_resource_type() в PHP?
Was this page helpful?