关于php int 类型

在写接口的时候经常需要对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)

很明显直接强转溢出了导致数据成了负数,所以数据转换和判断一定要在业务逻辑判断之前进行。尤其是业务逻辑与账户资金相关的操作更要注意。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值