جلوگیری از محاسبه رشته متنی در PHP

در PHP، وقتی مقدار عددی درون رشته (string) باشد — مثل "۱۰" یا "۵ apples" — و در یک عمل ریاضی استفاده شود، PHP به‌صورت پیش‌فرض آن را به عدد تبدیل (type juggling) می‌کند. مثلاً:

$a = "10";
$b = 5;
echo $a + $b; // خروجی: ۱۵

🔹 این رفتار خودکار گاهی باعث بروز خطا یا نتیجه غیرمنتظره می‌شود.
برای جلوگیری از محاسبه خودکار رشته‌های عددی در عملیات ریاضی، چند روش وجود دارد:


✅ روش ۱: استفاده از declare(strict_types=1);

اگر در بالای فایل بنویسی:

declare(strict_types=1);

در این صورت، اگر تابعی عدد بخواهد ولی رشته بدهی، خطای TypeError می‌گیری.
اما توجه کن: این فقط در تابع‌هایی که نوع ورودی‌شان مشخص شده کار می‌کند، نه در تمام عملیات ریاضی ساده.

مثلاً:

declare(strict_types=1);

function add(int $a, int $b): int {
    return $a + $b;
}

echo add("10", 5); // خطا می‌دهد


✅ روش ۲: بررسی نوع داده با is_numeric() یا is_int()

قبل از انجام عمل ریاضی، نوع متغیر را بررسی کن:

$a = "10a";

if (is_numeric($a)) {
    echo $a + 5;
} else {
    echo "خطا: مقدار عددی نیست!";
}

📌 این روش اجازه محاسبه را فقط در صورت عددی بودن واقعی مقدار می‌دهد.


✅ روش ۳: تبدیل صریح (type casting) و بررسی نتیجه

اگر بخواهی مطمئن شوی فقط در صورت درست بودن تبدیل انجام شود:

$a = "10a";
if ((string)(int)$a === $a) {
    echo $a + 5;
} else {
    echo "خطا: مقدار عددی معتبر نیست.";
}


✅ روش ۴: استفاده از توابع اعتبارسنجی فیلترها

تابع filter_var() نیز می‌تواند برای بررسی دقیق‌تر استفاده شود:

$a = "10a";

if (filter_var($a, FILTER_VALIDATE_INT) !== false) {
    echo $a + 5;
} else {
    echo "خطا: فقط عدد صحیح مجاز است!";
}


🔒 خلاصه کاربردی:

هدفدستور مناسب
جلوگیری از محاسبه رشته‌ها در تابع‌هاdeclare(strict_types=1)
بررسی قبل از محاسبهis_numeric() یا filter_var()
کنترل دستی نوعتبدیل صریح و مقایسه