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);
?>Вывод:
streamphp://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(), чтобы никогда не вызывать её на закрытом или недопустимом значении.