Is resource: примеры (PHP)

Функция 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)' для закрытого). Является более универсальной, но менее производительной для проверки одного типа.

get_resource_type()

Возвращает строку, описывающую тип ресурса (например, '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

Наиболее значимое изменение связано с PHP 8.0, где многие функции расширений (таких как GD, XMLWriter, XMLParser) стали возвращать объекты вместо ресурсов. Поэтому использование is_resource() для результатов этих функций теперь всегда возвращает false. Для совместимости рекомендуется использовать проверку is_object() или соответствующие методы классов.

Закрытые ресурсы

В ранних версиях PHP закрытый ресурс мог определяться функцией gettype() как 'unknown type'. Сейчас gettype() возвращает строку 'resource (closed)', а is_resource() — false.

Расширенные примеры применения

Проверка в пользовательской функции валидации
Пример php
<?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
<?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 не ресурс.
Сравнение с is_object в современном PHP
Пример php
<?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); // true
object
true

Is resource в MySQL

В языке SQL нет подобной динамической типизации и функций проверки типа. Работа с соединениями осуществляется через внутренние механизмы СУБД.

PHP is_resource function comments

En
Is resource Finds whether a variable is a resource