php整数变量需用无引号字面量(如123、0x1a)或强制转换((int));字符串数字须显式转换,大整数超范围需gmp/bcmath,http参数默认为字符串,须用filter_input等校验转换。

PHP整数变量怎么写才不会被当成字符串
PHP里整数变量不靠声明类型,靠赋值时的字面量或转换行为。直接写 123、-456、0x1A(十六进制)、0b1010(二进制)、0123(八进制,注意前导零)会被识别为整数;但一旦加了引号,比如 "123",就是字符串,哪怕内容全是数字。
- 用
var_dump($x)检查类型,别信echo或print的输出——它们会隐式转换 -
0123在 PHP 8.0+ 仍合法(八进制),但08或09会报 Parse error:八进制不支持 8 和 9 - 从字符串转整数,优先用
(int)强制转换或intval(),别依赖+ $str这种隐式方式——遇到空格或非数字前缀会截断出人意料
为什么 intval("0x1F") 返回 0 而不是 31
intval() 默认按十进制解析,不识别进制前缀。它看到 "0x1F" 开头不是数字,直接返回 0;而 0x1F 字面量本身是合法整数(31),但一旦进字符串,就失去进制含义。
- 要解析带前缀的字符串,用
hexdec()(十六进制)、bindec()(二进制)、octdec()(八进制) -
filter_var("0x1F", FILTER_VALIDATE_INT)同样失败——它只认纯十进制字符串 - 如果不确定输入格式,先用正则判断前缀,再分发调用对应函数,比硬套一个函数更稳
大整数超出 PHP_INT_MAX 怎么办
32 位系统上 PHP_INT_MAX 是 2147483647,64 位是 9223372036854775807。超过这个值,整数字面量会被自动转成 float,精度丢失——比如 9223372036854775808 可能变成 9.2233720368548E+18,尾数归零。
- 用
is_int()检查变量是否真为整型,别只看gettype()返回的 "integer"(它对 float 也常误报) - 涉及 ID、时间戳、加密运算等敏感场景,超出范围必须用
gmp或bcmath扩展,例如gmp_init("9223372036854775808") - JSON 解码时,大整数默认变 float,需传
JSON_BIGINT_AS_STRING选项保字符串形式,后续再处理
从表单或 URL 获取的数字为什么总是字符串
HTTP 请求所有参数本质都是字符串。$_GET["id"] 或 $_POST["count"] 拿到的永远是 string 类型,哪怕浏览器地址栏里写的是 ?id=123。
立即学习“PHP免费学习笔记(深入)”;
- 别直接拿
$_GET["id"]做算术或数据库 where 条件——可能被注入或类型不匹配 - 用
filter_input(INPUT_GET, "id", FILTER_VALIDATE_INT),它既校验又转换,失败返回false,比(int)更安全(后者把"abc"变成 0) - 数据库查询中,PDO 预处理能防注入,但类型仍需自己控制:绑定参数时指定
PDO::PARAM_INT,否则可能触发隐式转换异常











