| 特性 | 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)
*/
?>
<?php
$hex = 'FF';
echo intval($hex, 16); // 255 ✅
echo (int)$hex; // 0 ❌ 無法識別十六進制字符串
?>
<?php
$str = 'a165';
echo intval($str); // 0
echo (int)$str; // 0
// 兩者行為一致:遇到非數字字符停止解析
?>
<?php
$val = 1.9999999999999999; // 接近 2
echo intval($val); // 1
echo (int)$val; // 1
// 兩者均為截斷取整,非四捨五入
// 需四捨五入請用 round()
echo round(1.999); // 2
?>
<?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
?>
<?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
$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) 可獲得更嚴格驗證(如範圍、選項)。$obj->__toString() 再轉換。(int) 是語言級類型轉換,性能優、語法短,適用 95% 場景。intval() 提供進制參數,處理十六/八進制字符串時不可替代。理解兩者邊界差異,編寫更健壯的類型轉換代碼。