Is resource: примеры (PHP)
is_resource(mixed $value): boolОсновные сведения о функции is_resource
Функция is_resource() в языке PHP применяется для проверки, является ли переменная ресурсом (resource). Ресурс — это специальный тип данных, ссылающийся на внешние источники, такие как дескрипторы файлов, соединения с базами данных, изображения GD.
Использование функции актуально в ситуациях, когда требуется удостовериться, что переменная содержит корректный ресурс перед выполнением операций, зависящих от этого типа. Это помогает избежать ошибок выполнения.
Функция принимает один обязательный параметр:
- $var (mixed) — проверяемая переменная.
Возвращаемое значение — логическое: true, если переменная является ресурсом, и false в противном случае.
Простые примеры использования
Код демонстрирует базовые случаи применения функции.
<?php
// Пример с ресурсом файла
$fileHandle = fopen('test.txt', 'r');
var_dump(is_resource($fileHandle)); // Ожидается true
fclose($fileHandle);
// Пример с целым числом
$integer = 42;
var_dump(is_resource($integer)); // Ожидается false
// Пример с массивом
$array = [1, 2, 3];
var_dump(is_resource($array)); // Ожидается false
// Пример с объектом
$object = new stdClass();
var_dump(is_resource($object)); // Ожидается false
?>bool(true) bool(false) bool(false) bool(false)
<?php
$handle = fopen('test.txt', 'r');
fclose($handle);
var_dump(is_resource($handle));
?>bool(false)
Похожие функции в PHP
Для анализа типа переменной существуют другие встроенные функции.
Возвращает строку, указывающую тип переменной. Для ресурса вернет строку 'resource' (или 'resource (closed)' для закрытого). Является более универсальной, но менее производительной для проверки одного типа.
Возвращает строку, описывающую тип ресурса (например, 'stream', 'gd'). Если передать не ресурс, функция вернет false и вызовет предупреждение. Полезно для уточнения вида ресурса.
Начиная с PHP 8.0, многие расширения возвращают объекты вместо ресурсов. Для совместимости с новым кодом часто используют проверку на объект.
- is_resource() — для быстрой проверки именно типа resource (актуально для кода, работающего с расширениями, еще не перешедшими на объекты).
- get_resource_type() — когда нужна информация о конкретном виде ресурса.
- gettype() — в отладочных целях для получения общего типа.
- is_object() — для современного кода на PHP 8+, где ресурсы часто заменены объектами.
Типичные ошибки и нюансы
Передача неопределенной переменной вызовет предупреждение, но функция вернет false.
<?php
// Переменная $undefined не объявлена
var_dump(@is_resource($undefined)); // Используем @ для подавления предупреждения
?>bool(false)
В PHP 8+ передача нуля аргументов вызовет фатальную ошибку.
<?php
// Код вызовет TypeError в PHP 8
// var_dump(is_resource());
?>После закрытия ресурса (например, функцией fclose) переменная перестает быть ресурсом, и is_resource() вернет false. Это нормальное поведение, но его нужно учитывать в логике программы.
<?php
$fp = fopen('test.txt', 'r');
fclose($fp);
if (!is_resource($fp)) {
echo 'Ресурс уже закрыт.';
}
?>Ресурс уже закрыт.
История изменений в PHP
Наиболее значимое изменение связано с PHP 8.0, где многие функции расширений (таких как GD, XMLWriter, XMLParser) стали возвращать объекты вместо ресурсов. Поэтому использование is_resource() для результатов этих функций теперь всегда возвращает false. Для совместимости рекомендуется использовать проверку is_object() или соответствующие методы классов.
В ранних версиях PHP закрытый ресурс мог определяться функцией gettype() как 'unknown type'. Сейчас gettype() возвращает строку 'resource (closed)', а is_resource() — false.
Расширенные примеры применения
<?php
function validateResource($potentialResource) {
if (is_resource($potentialResource)) {
$type = get_resource_type($potentialResource);
return "Корректный ресурс типа: $type";
}
return 'Переменная не является ресурсом.';
}
$stream = fopen('php://memory', 'r+');
echo validateResource($stream) . "\n";
fclose($stream);
echo validateResource($stream) . "\n";
echo validateResource('test string');
?>Корректный ресурс типа: stream Переменная не является ресурсом. Переменная не является ресурсом.
<?php
$resources = [];
$resources[] = fopen('test.txt', 'r'); // Дескриптор файла
$resources[] = imagecreate(100, 100); // Ресурс GD (если расширение активно)
$resources[] = curl_init(); // Ресурс cURL (если расширение активно)
$resources[] = null;
foreach ($resources as $index => $item) {
if (is_resource($item)) {
echo "Элемент $index - ресурс: " . get_resource_type($item) . "\n";
// Закрытие ресурсов в зависимости от типа
switch (get_resource_type($item)) {
case 'stream':
fclose($item);
break;
case 'gd':
imagedestroy($item);
break;
case 'curl':
curl_close($item);
break;
}
} else {
echo "Элемент $index не ресурс.\n";
}
}
?>Элемент 0 - ресурс: stream Элемент 1 - ресурс: gd Элемент 2 - ресурс: curl Элемент 3 не ресурс.
<?php
// В PHP 8+ функция xml_parser_create() возвращает объект XMLParser
$parser = xml_parser_create();
var_dump('is_resource:', is_resource($parser));
var_dump('is_object:', is_object($parser));
if (is_object($parser)) {
echo 'Для работы используйте методы класса XMLParser.';
}
xml_parser_free($parser);
?>string(11) "is_resource:" bool(false) string(10) "is_object:" bool(true) Для работы используйте методы класса XMLParser.
Аналоги в других языках программирования
Is resource в Python
Прямого аналога нет. Тип ресурса зависит от конкретной библиотеки. Часто проверяют, является ли объект экземпляром определенного класса (например, io.IOBase для файловых потоков).
import io
file_handle = open('test.txt', 'r')
print(isinstance(file_handle, io.IOBase)) # Проверка через наследование
file_handle.close()True
Is resource в Javascript
Концепция ресурсов как отдельного типа отсутствует. Работа с внешними источниками (например, File API) ведется через объекты. Проверка сводится к анализу типа объекта или наличия специфических методов.
// Пример с FileReader (браузерное API)
const reader = new FileReader();
console.log(typeof reader); // 'object'
console.log(reader instanceof FileReader); // trueobject true
Is resource в MySQL
В языке SQL нет подобной динамической типизации и функций проверки типа. Работа с соединениями осуществляется через внутренние механизмы СУБД.