萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 網路程式設計 >> PHP 程式設計

PHP intval() 與 (int) 強制類型轉換區別詳解

語法對比

特性intval($var)(int)$var
類型函數語言結構 (Type Casting)
基礎進制支援指定進制 intval($var, $base)僅十進制
執行速度稍慢(函數調用開銷)極快(OPcode 級優化)
對象處理觸發 __toString() 再轉換直接轉換為 1 (PHP 7.4+ 棄用),PHP 8 拋 TypeError
資源類型返回資源 ID返回資源 ID

行為一致場景

<?php
$tests = ['165', '0', '-10', '3.14', '  42  ', '0xFF']; // 字符串

foreach ($tests as $val) {
    echo "原值: '$val' (".gettype($val).")\n";
    echo "intval: " . intval($val) . " (" . gettype(intval($val)) . ")\n";
    echo "(int) : " . (int)$val . " (" . gettype((int)$val) . ")\n";
    echo "---\n";
}

/* 關鍵輸出對比:
'165'      -> intval:165, (int):165
'3.14'     -> intval:3,   (int):3
'  42  '   -> intval:42,  (int):42 (自動忽略空白)
'0xFF'     -> intval:0,   (int):0  (十六進制字符串 intval 預設不識別,需指定 base=16)
*/
?>

關鍵差異場景

1. 進制轉換

<?php
$hex = 'FF';
echo intval($hex, 16); // 255 ✅
echo (int)$hex;        // 0   ❌ 無法識別十六進制字符串
?>

2. 非數字字符串開頭

<?php
$str = 'a165';
echo intval($str); // 0
echo (int)$str;    // 0
// 兩者行為一致:遇到非數字字符停止解析
?>

3. 浮點數精度陷阱

<?php
$val = 1.9999999999999999; // 接近 2
echo intval($val); // 1
echo (int)$val;    // 1
// 兩者均為截斷取整,非四捨五入

// 需四捨五入請用 round()
echo round(1.999); // 2
?>

4. 對象轉換 (PHP 8.0+ 破壞性變更)

<?php
class Test {
    public function __toString() { return '42'; }
}

$obj = new Test();
echo intval($obj); // 42 (調用 __toString)
echo (int)$obj;    // PHP 7.4: 1 + Deprecation警告; PHP 8.0+: TypeError
?>

5. 陣列/資源轉換

<?php
$arr = [1,2,3];
$res = fopen('php://memory', 'r');

echo intval($arr); // 1 (PHP 7+ 拋 Warning) | PHP 8: TypeError
echo (int)$arr;    // 1 (PHP 7+ 拋 Warning) | PHP 8: TypeError

echo intval($res); // 資源 ID (如 4)
echo (int)$res;    // 資源 ID (如 4)
?>

性能基準測試 (PHP 8.2, 1億次循環)

<?php
$str = '12345';
$iterations = 100_000_000;

$start = hrtime(true);
for ($i = 0; $i < $iterations; $i++) { $a = (int)$str; }
echo "(int) 耗時: " . (hrtime(true) - $start) / 1e9 . "s\n";

$start = hrtime(true);
for ($i = 0; $i < $iterations; $i++) { $b = intval($str); }
echo "intval 耗時: " . (hrtime(true) - $start) / 1e9 . "s\n";

/* 典型結果:
(int)  耗時: ~0.35s
intval 耗時: ~0.55s
差異約 30-50%,源於函數調用開銷
*/
?>

最佳實踐建議

  • 日常整型轉換:優先使用 (int)$var,性能更好、語法更簡潔。
  • 指定進制解析:必須用 intval($str, 16) 或 base_convert()。
  • 用戶輸入清洗:配合 filter_var($input, FILTER_VALIDATE_INT) 可獲得更嚴格驗證(如範圍、選項)。
  • 避免對象直接轉 int:PHP 8+ 會拋錯,請顯式調用 $obj->__toString() 再轉換。

總結

(int) 是語言級類型轉換,性能優、語法短,適用 95% 場景。intval() 提供進制參數,處理十六/八進制字符串時不可替代。理解兩者邊界差異,編寫更健壯的類型轉換代碼。

copyright © 萬盛學電腦網 all rights reserved