ویژگی تصویر

تابع intval() در PHP

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

تابع intval() یکی از توابع پایه‌ای PHP برای تبدیل مقدارهای مختلف به عدد صحیح (integer) است. این تابع ساده به نظر می‌رسد، اما در عمل چند نکتهٔ مهم و گوشه‌های خاص دارد که دانستن آن‌ها در نوشتن کدهای ایمن و بدون اشکال حیاتی است. در این مقاله رفتارها، موارد کاربرد، نمونه‌ها و بهترین شیوه‌ها را با زبانی روشن بررسی می‌کنیم.

امضای تابع

تابع به شکل زیر تعریف می‌شود:

int intval ( mixed $var [, int $base = 10 ] )

پارامتر $var مقدار ورودی است و $base در صورت قرار گرفتن برای رشته‌ها تعیین‌کنندهٔ مبنای عدد است (از 2 تا 36).

رفتار کلی و قوانین تبدیل

  • برای عددهای اعشاری (float) تبدیل با حذف بخش اعشاری و truncate به سمت صفر انجام می‌شود (مثلاً 3.9 → 3 و -3.9 → -3).
  • برای بولین‌ها true → 1 و false → 0 خواهد شد.
  • برای null مقدار 0 برگردانده می‌شود.
  • برای رشته‌ها تبدیل تا اولین کاراکتر غیرمجاز ادامه می‌یابد؛ یعنی از ابتدای رشته تا اولین کاراکتر غیررقمی خوانده می‌شود (مثلاً “123abc” → 123، “abc123” → 0).
  • برای آرایه‌ها: آرایهٔ خالی به 0 و آرایهٔ غیرخالی معمولاً به 1 تبدیل می‌شود (رفتار پیش‌فرض PHP).
  • برای اشیاء رفتار ساده است و معمولاً تبدیل به 1 انجام می‌شود مگر آنکه شما مقدار رشته‌ای استخراج و سپس تبدیل کنید.
  • در مورد سیستم‌های 32/64 بیتی اندازهٔ int متفاوت است؛ اعداد خیلی بزرگ ممکن است منجر به پیامدهای ناخواسته شوند.

نمونه‌های ساده

<?php
echo intval("123abc"); // 123
echo intval("abc123"); // 0
echo intval(3.99);     // 3
echo intval(true);     // 1
echo intval(null);     // 0
echo intval([]);       // 0
echo intval([1,2]);    // 1
?>

توضیح: در این مثال‌ها رفتار پایه‌ای intval نمایش داده شده است: رشته تا اولین کاراکتر نامعتبر خوانده می‌شود، برای اعشار قسمت اعشاری حذف می‌شود و آرایهٔ غیرخالی به 1 تبدیل می‌شود.

پارامتر مبنا (base) برای رشته‌ها

وقتی مقدار ورودی رشته است می‌توانید مبنای تبدیل را مشخص کنید. برای مثال تبدیل از مبنای 16 (هجده‌شش) یا 2 (دودویی) ممکن است مفید باشد.

<?php
echo intval("FF", 16);    // 255
echo intval("1010", 2);   // 10
echo intval("77", 8);     // 63
?>

توضیح: در این کد، رشته‌ها با توجه به مبنای مشخص‌شده به عدد صحیح تبدیل می‌شوند. اگر کاراکترهای رشته خارج از دامنهٔ مبنا باشند، تبدیل تا قبل از آن کاراکتر خاتمه می‌یابد یا 0 برمی‌گردد.

مثال‌های عملی و کاربردی

<?php
// خواندن پارامتر GET و ایمن‌سازی به کمک intval
$page = isset($_GET['page']) ? intval($_GET['page']) : 1;
if ($page < 1) $page = 1;

// تبدیل دادهٔ فرم که ممکن است شامل رشته باشد
$qty = intval($_POST['quantity']);
if ($qty <= 0) { /* خطا یا مقدار پیش‌فرض */ }
?>

توضیح: در صفحات وب معمولاً پارامترها به صورت رشته می‌آیند؛ intval سریع‌ترین راه برای گرفتن مقدار عددی است. با این حال همیشه بهتر است علاوه بر intval اعتبارسنجی بیشتری انجام شود (مثلاً بررسی محدودهٔ مجاز).

مقایسهٔ intval() و راهکارهای امن‌تر

intval سریع و مفید است اما برای اعتبارسنجی دقیق مناسب نیست؛ به‌خصوص زمانی که می‌خواهیم مطمئن شویم ورودی دقیقاً یک عدد صحیح است (از نظر قالب). در این سناریوها توصیه می‌شود از موارد زیر استفاده کنید:

  • filter_var($v, FILTER_VALIDATE_INT) — برای بررسی اینکه آیا مقدار یک عدد صحیح معتبر است یا خیر.
  • ctype_digit() — برای بررسی اینکه رشته فقط شامل ارقام مثبت است (توجه: علامت منفی را مجاز نمی‌داند).
  • preg_match — برای قواعد پیچیده‌تر مانند محدوده یا علامت.
<?php
$raw = $_POST['age'];
if (filter_var($raw, FILTER_VALIDATE_INT) === false) {
    // ورودی معتبر نیست
} else {
    $age = intval($raw);
}
?>

توضیح: در این نمونه ابتدا از filter_var برای تشخیص اعتبار رشته به عنوان عدد صحیح استفاده شده و سپس intval برای تبدیل به int به کار رفته است. این الگو از خطاهای ناشی از ورودی‌های نامعتبر جلوگیری می‌کند.

جدول رفتار برای انواع مختلف ورودی

ورودینتیجهٔ intvalتوضیح
“123”123رشتهٔ عددی ساده
“123abc”123تا اولین کاراکتر غیرعددی
“abc123”0ابتدای رشته عددی نیست
3.93حذف قسمت اعشاری
true1بولین به عدد
[]0آرایهٔ خالی
[1]1آرایهٔ غیرخالی

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

  • اندازهٔ int وابسته به معماری سیستم است؛ در سیستم‌های 64 بیتی محدودهٔ بزرگ‌تری دارید. برای کار با اعداد خیلی بزرگ از کتابخانه‌هایی مثل BCMath یا GMP استفاده کنید.
  • اگر به دقت فرمت رشته اهمیت دارد (مثلاً بولین‌های متنی “true”/”false” یا نمادهای ارز) intval ممکن است کافی نباشد.
  • در صورت نیاز به تشخیص اینکه ورودی واقعاً عددی بوده یا تبدیل شده است، از is_numeric() قبل از intval استفاده کنید.
  • برای خواندن مبناهای خاص (هگزادسیمال) یا ورودی‌های پیشرفته از پارامتر base یا توابع مخصوص استفاده کنید.

خلاصه و بهترین شیوه‌ها

تابع intval ابزار مفیدی برای تبدیل سریع مقادیر به عدد صحیح است، اما برای اعتبارسنجی و امنیت ورودی‌ها بهتر است ترکیبی از filter_var، is_numeric و intval را به کار ببرید. همواره دربارهٔ آرایه‌ها، اشیاء، رشته‌های غیرمنتظره و محدودیت‌های اندازهٔ int احتیاط کنید و در مواردی که دقت مهم است از توابع تخصصی‌تر بهره ببرید.

در پایان، یک مثال بهینه‌سازی‌شده برای دریافت عدد صفحه از URL که ایمن و مقاوم است:

<?php
// امن‌سازی و تعیین مقدار پیش‌فرض برای پارامتر page
$pageRaw = $_GET['page'] ?? null;
if ($pageRaw === null) {
    $page = 1;
} elseif (filter_var($pageRaw, FILTER_VALIDATE_INT) !== false) {
    $page = (int) $pageRaw;
    if ($page < 1) $page = 1;
} else {
    $page = 1; // یا خطا
}
?>

توضیح: این الگو امن‌تر از صرفاً intval است. ابتدا وجود پارامتر بررسی می‌شود، سپس با filter_var اعتبارسنجی شده و در نهایت به int تبدیل می‌شود و محدودیت‌های منطقی (مانند حداقل 1) اعمال می‌گردد.

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

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