1.基本定义与语法

intval()是PHP的内置函数,用于将变量转换为整数类型。

intval($value,$base) //返回整型,若返回失败就返回0

形参介绍

  • $value:要转换的变量
  • base:进制基数(仅当value为字符串时生效),范围2-36,默认为10。

核心工作原理

  • 对字符串:从左到右解析,直到遇到非数字字符停止
  • 对浮点数:直接截断小数部分(不四舍五入)
  • 对布尔值:true是1,false是0
  • 对特殊类型:空值、数组、对象等返回0
  • 进制处理:当value为字符串且base有效时,按指定进制解析

详细用法示例

  • 基本类型转换
//字符串
intval("123");   //123
intval("123abc");  //123(截断非数字字符)
intval("abc123");  //0(无法从开头解析数字)
intval("");  //0
intval("~~1000");//0

//浮点数
intval(12.99);  //12(截断,不四舍五入)
intval(-12.99); //-12
intval(1e5); //100000
intval('1e5'); //1(把'1e5'当字符串处理)
intval((0.1+0.7)*10; //按照正常数学逻辑,结果应该是 8,但由于底层其实是 7.9999...,截断后实际上会输出 7

//布尔值
intval(true);  //1
intval(false); //0
intval(null);  //0

//复合类型
intval([]); //0(空数组返回0,非空数组返回1)
intval(new stdClass); //触发错误(通常是 E_WARNING 或 E_NOTICE 级别的警告)并且函数会强制返回 1。
intval(fopen(_FILE_,'r'));  //0(资源类型)
  • 进制转换详解
//二进制
intval('1010',2); //10
intval('1010',0); //1010(base=0 自动检测前缀,但此例无前缀,所以当十进制处理)

//八进制
intval('12',8); //10
intval('012',0); //10(自动检测前缀,‘012’的前缀为0,符合八进制,按八进制处理)

//十六进制
intval('A',16);  //10
intval('0xA',0);  //10(自动识别0x前缀)
intval('0xA',16);  //10

//特殊情况
intval('FF',10); //0(FF不是十进制数字)
intval(255,16);  //255(base被忽略,因为255不是字符串)

intval()致命缺点(陷阱)

  • 静默失败

无效输入统一返回0,无法与合法输入的0区分

// 攻击者提交:?user_id=admin
$userId = intval($_GET['user_id']); // 0

// 若系统存在 id=0 的管理员账户...
$user = getUserById($userId); // 可能返回管理员!
  • 浮点精度缺陷
// 金融计算灾难
$amount = 0.1 + 0.2; // 实际 ≈ 0.30000000000000004
$cents = intval($amount * 100); // 30 还是 29?取决于 PHP 版本和平台
  • 无法处理大整数
// 32 位系统
intval("2147483648"); // -2147483648(溢出为负数!)

// 64 位系统
intval("9223372036854775808"); // 可能溢出

更多推荐