ویژگی تصویر

تابع get_resource_type() در PHP

  /  PHP   /  تابع get_resource_type() در PHP
بنر تبلیغاتی الف
آموزش PHP

تابع get_resource_type() یکی از توابع مفید برای تشخیص نوع منابع (resources) در PHP است. منابع در PHP معمولاً به‌عنوان اشاره‌گرهایی به منابع خارجی مثل فایل‌ها، سؤالات دیتابیس قدیمی، یا هندل‌های کتابخانه‌های سی عمل می‌کنند. با گذر زمان بسیاری از این منابع در نسخه‌های جدید PHP به آبجکت‌ها تبدیل شده‌اند، اما هنوز در مواقعی کاربرد دارد که لازم است نوع یک resource را برای دیباگ یا بررسی منطقی بررسی کنیم.

تعریف و رفتار پایه

  • امضای تابع: get_resource_type(resource $res): string
  • ورودی باید یک resource باشد؛ در غیر این صورت هشدار (warning) صادر می‌شود.
  • خروجی یک رشته متنی است که نوع منبع را توصیف می‌کند، مثلاً “stream”، “gd” یا “mysql link”.
  • پس از آزادسازی resource یا هنگام کار با نسخه‌های جدید PHP که به‌جای resource از object استفاده می‌کنند، رفتار متفاوت خواهد بود — بنابراین ابتدا باید با is_resource() بررسی کنید.

مثال ساده

$f = fopen('php://memory', 'r+');
if (is_resource($f)) {
    echo get_resource_type($f); // معمولاً "stream"
    fclose($f);
}

if (!is_resource($f)) {
    echo 'resource آزاد یا معتبر نیست';
}

در این مثال ابتدا فایل با fopen باز می‌شود؛ با استفاده از is_resource() اطمینان حاصل می‌کنیم که پارامتر معتبر است و سپس get_resource_type() نوعِ resource را چاپ می‌کند. بعد از بسته شدن با fclose()، is_resource مقدار false بازمی‌گرداند.

مثال پیشرفته‌تر: چک امن نوع منبع

function describe_resource($r) {
    if (!is_resource($r)) {
        return 'Not a resource';
    }

    $type = get_resource_type($r);

    // اگر PHP نسخه جدیدی باشد ممکن است get_resource_id وجود داشته باشد
    $id = function_exists('get_resource_id') ? get_resource_id($r) : 'n/a';

    return sprintf('type=%s, id=%s', $type, $id);
}

$fp = fopen('php://temp', 'w+');
echo describe_resource($fp);
fclose($fp);

این تابع کمکی ابتدا با is_resource مطمئن می‌شود که پارامتر resource است، سپس نوع آن را با get_resource_type می‌گیرد و در صورت امکان id منبع را با get_resource_id (در نسخه‌های جدیدتر PHP) گزارش می‌دهد. چنین ترکیبی برای لاگ‌ و دیباگ بسیار مفید است.

موارد رایج انواع Resource و تبدیل‌های مدرن

نوع قدیمی (resource)مثالجایگزین مدرن
streamfopen, fsockopenهمچنان resource/Stream، ولی اغلب با کلاس‌ها مدیریت می‌شود
gdimagecreateGdImage (PHP 8+) — دیگر resource نیست
curlcurl_initCurlHandle / CurlMultiHandle (PHP 8+)
mysql linkmysql_connect (منسوخ)mysqli / PDO (اشیاء)

این جدول نشان می‌دهد که در نسخه‌های جدید PHP بسیاری از منابع تبدیل به آبجکت شده‌اند. بنابراین دستورات مبتنی بر resource — از جمله get_resource_type — کاربردشان در حال کاهش است، اما هنوز برای کد Legacy و برخی توابع سطح پایین مفیدند.

بهترین شیوه‌ها و نکات امنیتی

  • هرگز مستقیماً روی خروجی get_resource_type برای منطق بحرانی حساب نکنید؛ بهتر است از توابع معتبر و نوع‌دهی مناسب استفاده کنید.
  • قبل از فراخوانی get_resource_type همیشه از is_resource استفاده کنید تا از هشدارهای PHP جلوگیری شود.
  • در پروژه‌های مدرن از آبجکت‌ها و type-hinting استفاده کنید؛ این روش خوانایی و قابلیت نگهداری را افزایش می‌دهد.
  • برای ثبت لاگ و دیباگ، ترکیب get_resource_type و get_resource_id (در صورت موجود بودن) اطلاعات مفیدی ارائه می‌دهد.

نمونه کاربرد در دیباگ یک تابع

function safe_close($res) {
    if (is_resource($res)) {
        $type = get_resource_type($res);
        // فقط به‌عنوان نمونه: برای stream از fclose استفاده می‌کنیم
        if ($type === 'stream') {
            fclose($res);
            return true;
        }
        // سایر انواع باید با روش مخصوص خود بسته شوند
        return false;
    }
    return false;
}

در این مثال تابع safe_close ابتدا بررسی می‌کند که ورودی resource است سپس بر اساس نوع تصمیم می‌گیرد چه عملی انجام دهد. توجه داشته باشید که این روش ساده است و در عمل بهتر است برای هر نوع resource تابع خاصی نوشته شود یا از مدیریت منابع توسط آبجکت استفاده شود.

نکات سازگاری با نسخه‌های جدید PHP

  • در PHP 8 و بالاتر بسیاری از توابع بازگشتی resource به‌جای resource، آبجکت بازمی‌گردانند؛ بنابراین is_resource برای آن‌ها false خواهد شد.
  • قبل از استفاده در پروژه‌ای که نسخه‌های PHP متنوعی را پشتیبانی می‌کند، رفتار توابع و نوع بازگشتی آن‌ها را در مستندات آن نسخه چک کنید.
  • به‌عنوان قاعده کلی، برای کد جدید از APIهای مبتنی بر آبجکت (مثل PDO، mysqli، CurlHandle) استفاده کنید تا وابستگی به resource کاهش یابد.

خلاصه و نتیجه‌گیری

تابع get_resource_type() ابزاری ساده اما کاربردی برای شناخت نوع منابع در PHP است. این تابع در کدهای Legacy و هنگام دیباگ منابع سطح پایین بسیار مفید است. با این حال، به دلیل تغییر رویکرد PHP به سمت آبجکت‌ها، بهتر است در کد جدید کمتر به resourceها تکیه کنید و از جایگزین‌های مدرن و type-hinting بهره ببرید. همیشه پیش از فراخوانی get_resource_type از is_resource استفاده کنید و برای عیب‌یابی ترکیب آن با get_resource_id می‌تواند مفید باشد.

در صورت نیاز می‌توان مثال‌های بیشتری از منابع خاص و نحوه مهاجرت آن‌ها به آبجکت در نسخه‌های جدید PHP ارائه کرد.

آیا این مطلب برای شما مفید بود ؟

خیر
بله
موضوعات شما در انجمن: