settype($var, 'integer') 是运行时强制类型转换,会修改原变量并截断小数或丢弃非数字字符;(int) 更安全轻量,不改变原变量,推荐优先使用。

settype($var, 'integer') 能直接转整型,但会截断小数、丢弃非数字字符
它不是类型声明,而是运行时强制转换,对已知安全值(比如表单传来的纯数字字符串)确实够用。但要注意:settype 修改原变量,返回布尔值表示是否成功,不返回新值。
- 字符串
"123"→ 变成整型123,成功返回true - 字符串
"123.45"→ 变成123(小数部分被截断) - 字符串
"123abc"→ 变成123(从头读到第一个非数字字符为止) - 字符串
"abc123"→ 变成0(开头无数字,整个视为无效) -
null或空字符串""→ 变成0
为什么不用 (int) 强制转换?它更轻量且语义清晰
对已知安全值,(int) 强制转换通常比 settype 更合适:不修改原变量、无副作用、性能略高、意图明确。
-
$val = "456"; $int = (int)$val;——$val仍是字符串,$int是整型 -
settype($val, 'integer')——$val本身被改写,后续逻辑可能误用 - 如果只是临时需要整型参与计算,
(int)更安全;只有真要“就地改造”变量类型时才考虑settype
验证安全值再转,别只靠 settype 做防护
settype 不校验输入合法性,它只是“尽力而为”。所谓“已知安全值”,意味着你已确认来源可信(如配置文件、内部枚举),或已做过前置校验。
- 错误做法:
settype($_GET['id'], 'integer')—— 若$_GET['id']是"123; DROP TABLE users",settype仍会转出123,但你没意识到中间有分号被忽略 - 推荐做法:
if (ctype_digit($_GET['id']) || (is_string($_GET['id']) && $_GET['id'][0] === '-' && ctype_digit(substr($_GET['id'], 1)))) { $id = (int)$_GET['id']; } - 或者用
filter_var($_GET['id'], FILTER_VALIDATE_INT),失败返回false,比settype的“硬转”更可控
注意 settype 对数组、对象、资源的无效性
settype 对非标量类型行为受限:数组和对象无法转成整型(返回 false),资源转整型得到的是资源 ID(不稳定,不建议依赖)。
立即学习“PHP免费学习笔记(深入)”;
$arr = ['a', 'b']; var_dump(settype($arr, 'integer')); // bool(false)$obj = new stdClass(); var_dump(settype($obj, 'integer')); // bool(false)$fp = fopen('a.txt', 'r'); settype($fp, 'integer'); // 可能转成某个整数ID,但下次运行可能不同
真正需要整型的地方,永远先确认变量是标量、且内容符合预期——settype 只是最后一道弱转换操作,不是兜底方案。











