تابع is_integer() در 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 | بررسی دقیق نوع integer | is_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 و سیستم عامل شما تهیه کرد.
آیا این مطلب برای شما مفید بود ؟



