
直接用 (int) 或 intval(),但结果可能出人意料
PHP 的强制类型转换不是“四舍五入”或“截断小数”,而是按规则丢弃非数字部分。比如 "123abc" 转成 int 是 123,而 "abc123" 是 0 —— 因为它从开头就找不到有效数字。
-
(int)"123.9"→123(只取整数部分,不四舍五入) -
(int)" 456 "→456(自动 trim 空格) -
(int)"0x1A"→0(十六进制字符串不会被识别,得用hexdec()) -
intval("123", 10)和(int)"123"行为一致;但intval("0123")在默认进制下会当八进制处理 →83,而(int)"0123"是123
filter_var($var, FILTER_VALIDATE_INT) 更安全,但返回 false 而不是 0
当你真正想“判断是否合法整数”时,(int) 和 intval() 都会默默转出一个数(哪怕原值是 null、false 或空字符串),容易掩盖逻辑错误。这时候该用验证型函数。
-
filter_var("123", FILTER_VALIDATE_INT)→123 -
filter_var("12.3", FILTER_VALIDATE_INT)→false -
filter_var("", FILTER_VALIDATE_INT)→false(不是0) - 支持范围限制:
filter_var("150", FILTER_VALIDATE_INT, ["options" => ["min_range" => 100, "max_range" => 200]])
字符串里混着单位或符号?先清理再转
像 "¥1,234.56" 或 "-42px" 这类带格式的字符串,不能靠强转解决。PHP 不会自动识别货币符号、千分位逗号或单位后缀。
- 别写
(int)"¥1,234.56"→ 得到0(开头非数字) - 先用正则提取数字部分:
preg_match('/-?\d+/', "¥1,234.56", $m); $int = (int)($m[0] ?? 0); - 如果含小数点且要保留精度,别用
(int),改用(int)round((float)$str)或更稳妥的filter_var($cleaned, FILTER_VALIDATE_FLOAT)后再取整
注意 null、false、空数组这些“假值”的转换结果
它们转 int 全是 0,但语义完全不同。比如数据库查不到记录返回 null,你却当成用户 ID 0 处理,就可能越权访问。
立即学习“PHP免费学习笔记(深入)”;
-
(int)null→0 -
(int)false→0 -
(int)[]→0 -
(int)""→0 - 真正需要区分时,优先用严格比较:
$var === 0,而不是(int)$var == 0
(int),而是没想清楚原始数据到底算不算“可转整数”。











