在写接口的时候经常需要对php的数字进行处理,当客户端发送数据过来的时候都认为数据是不可信的。
如果是整数的话一般直接强转,例如
$num = (int)$num
如果是一个浮点数的话,一般判断是否为数字例如
is_numeric($num)
但是使用(int)强行转换真的安全吗?
php官网说 如下解释
整型数的字长和平台有关,尽管通常最大值是大约二十亿(32 位有符号)。64 位平台下的最大值通常是大约 9E18,除了 Windows 下 PHP 7 以前的版本,总是 32 位的。 PHP 不支持无符号的 integer。Integer 值的字长可以用常量 PHP_INT_SIZE来表示,自 PHP 4.4.0 和 PHP 5.0.5后,最大值可以用常量 PHP_INT_MAX 来表示,最小值可以在 PHP 7.0.0 及以后的版本中用常量 PHP_INT_MIN 表示。
也就是说win环境下值为 2147483647 到 -2147483647 范围内值为int ,超出此范围会自动转换为float , 范围为 2^32
在linux 64位环境下值为 9223372036854775807 到 -9223372036854775807,超出此范围会自动转换为float , 范围为 2^64
那么在当客户端传参大于临界值时会怎么样呢
$min = 1;
$num = 2147483648;
var_dump($min < $num);
var_dump((int)$num);
//bool(true)
//int(-2147483648)
很明显直接强转溢出了导致数据成了负数,所以数据转换和判断一定要在业务逻辑判断之前进行。尤其是业务逻辑与账户资金相关的操作更要注意。