ویژگی تصویر

تابع is_integer() در PHP

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

در PHP تابع is_integer() برای تشخیص این که متغیر از نوع عدد صحیح (integer) است یا خیر کاربرد دارد. این تابع در حقیقت یک alias برای is_int() است و خروجی یک مقدار بولی (true/false) را برمی‌گرداند. در این مقاله به رفتار، مثال‌های کاربردی، تفاوت‌ها با توابع مرتبط و نکات حرفه‌ای درباره محدودیت‌ها و بهینه‌سازی‌ها می‌پردازیم.

نحوهٔ عملکرد پایه‌ای

صورت سادهٔ استفاده:

<?php
$a = 10;
$b = "10";
var_dump(is_integer($a)); // true
var_dump(is_integer($b)); // false

توضیح: این مثال نشان می‌دهد که is_integer() تنها وقتی true برمی‌گرداند که نوع متغیر دقیقاً integer باشد. رشته‌ای حتی اگر محتوی عدد باشد، نوع آن string است و false برمی‌گردد.

موارد استفادهٔ رایج

  • اعتبارسنجی نوع ورودی در توابع یا APIها قبل از انجام عملیات ریاضی
  • بررسی نوع داده هنگام دیباگ یا توسعهٔ لایهٔ مدل داده
  • استفاده در ترکیب با strict typing برای تضمین انطباق نوع

مثال کاربردی: اعتبارسنجی ورودی

<?php
function processAge($age) {
    if (!is_integer($age)) {
        throw new InvalidArgumentException('Age must be an integer.');
    }
    // پردازش بعدی
    return $age + 1;
}

echo processAge(30); // OK
echo processAge("30"); // Exception

توضیح: در این مثال تابع processAge در صورتی که مقدار ورودی از نوع integer نباشد، استثنا پرتاب می‌کند. اگر ورودی به صورت “30” رشته باشد، is_integer() آن را رد می‌کند که می‌تواند از خطاهای منطقی جلوگیری کند.

تفاوت is_integer با is_numeric و ctype_digit

تابعرفتارمثال
is_integer / is_intبررسی دقیق نوع integeris_int(5) => true, is_int(“5”) => false
is_numericآیا مقدار می‌تواند به عدد (int یا float) تبدیل شودis_numeric(“5”) => true, is_numeric(“5.2”) => true
ctype_digitبررسی رشته‌ای شامل تنها ارقام (نیاز به string)ctype_digit(“012”) => true, ctype_digit(12) => false

توضیح: هر کدام از این توابع هدف متفاوتی دارند. در اعتبارسنجی ورودی که نوع دقیق مد نظر است، is_integer مناسب است؛ اما اگر می‌خواهید ورودی عددی را از کاربران قبول کنید (حتی به صورت رشته)، is_numeric یا ctype_digit به‌کار می‌آیند.

نکات فنی و محدودیت‌ها

  • در PHP اندازهٔ integer وابسته به معماری سیستم است: معمولاً 32-بیتی یا 64-بیتی. مقدار حد بالایی از طریق PHP_INT_MAX مشخص می‌شود.
  • اگر عددی بزرگ‌تر از PHP_INT_MAX تولید شود، PHP آن را به float تبدیل می‌کند و در نتیجه is_integer() برای آن false خواهد بود.
  • is_integer نوع را چک می‌کند و هیچ تبدیل نوع خودکاری انجام نمی‌دهد؛ برای تبدیل از (int) یا intval() استفاده کنید.

مثال: عدد بزرگ‌تر از PHP_INT_MAX

<?php
$big = PHP_INT_MAX + 1;
var_dump($big); // ممکن است float باشد
var_dump(is_integer($big)); // معمولاً false

توضیح: این کد نشان می‌دهد که عبور از حدود پلتفرم موجب تبدیل به float می‌شود و بنابراین is_integer معیار درستی برای “محتوا” نیست بلکه برای “نوع” متغیر است.

توصیه‌های عملی و الگوهای بهتر

  • برای اعتبارسنجی داده‌های ورودی از کاربر (مثلاً پارامترهای GET/POST) بهتر است از filter_var با FILTER_VALIDATE_INT استفاده کنید تا هم اعتبارسنجی رشته‌ای انجام شود و هم امکان دریافت مقدار صحیح فراهم گردد.
  • اگر نیاز دارید که رشته‌هایی مانند “0” نیز معتبر تشخیص داده شوند، هنگام استفاده از filter_var بررسی با !== false را فراموش نکنید چون 0 در بررسی‌های بولی برابر false است.
  • در کدهای حساسی که نوع پارامترها باید دقیقاً رعایت شود، از declare(strict_types=1) و نوع‌دهی صریح پارامترها/مقادیر بازگشتی استفاده کنید.

مثال بهینه با filter_var و بررسی نهایی

<?php
$input = "0"; // از فرم یا query
$validated = filter_var($input, FILTER_VALIDATE_INT);
if ($validated === false) {
    echo "Not a valid integer";
} else {
    // $validated اکنون یک integer است
    echo $validated + 1;
}

توضیح: filter_var در صورت موفقیت مقدار تبدیل‌شده را بازمی‌گرداند (که از نوع integer است) و در غیر اینصورت false. استفاده از === ضروری است چون 0 با == برابر false می‌شود.

نکات پیشرفته و تجربهٔ حرفه‌ای

  • در سیستم‌هایی که داده‌ها از منابع خارجی (JSON، دیتابیس، API) می‌آیند، ابتدا نوع و دامنهٔ مقادیر را بررسی کنید. گاهی لازم است مقدار را cast کنید و سپس صحت آن را با is_integer بررسی کنید.
  • برای آرایه‌های بزرگ و پردازش‌های حجیم، از تایپ‌هینتینگ و validation لایه‌ای (مثلاً استفاده از DTO یا کتابخانهٔ validation) استفاده کنید تا بار بررسی نوع پراکنده کاهش یابد.
  • به تفاوت بین “قابلیت تبدیل به integer” (is_numeric) و “واقعاً integer بودن” (is_integer) توجه داشته باشید؛ انتخاب درست تابع می‌تواند از باگ‌ها جلوگیری کند.

خلاصه و بهترین عمل

  • is_integer() برای بررسی دقیقِ نوع integer مناسب است.
  • برای ورودی‌های کاربر که ممکن است رشته باشند، از is_numeric، ctype_digit یا filter_var استفاده کنید بسته به نیاز.
  • همیشه توجه داشته باشید که اندازهٔ integer در پلتفرم متفاوت است و تبدیل به float می‌تواند رخ دهد.
  • در برنامه‌نویسی مبتنی بر نوع (type-safe)، از declare(strict_types=1) و تایپ‌هینتینگ بهره ببرید تا نیاز به چک‌های دستی کمتر شود.

اگر به مثال‌های بیشتر یا بررسی رفتار is_integer در نسخه‌ها و محیط‌های مختلف PHP نیاز دارید، می‌توان نمونه‌هایی با توجه به نسخهٔ PHP و سیستم عامل شما تهیه کرد.

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

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