
PHP整型变量不用显式声明类型
PHP 是弱类型语言,$var 赋一个整数,它就是 int —— 没有 int $var 这种写法,也不需要 declare 或类型注解来“定义整型变量”。
常见错误现象:TypeError: Cannot assign string to property MyClass::$id of type int,这通常出现在启用了属性类型声明(PHP 7.4+)且写了 public int $id; 的类里,但赋值时传了字符串;这不是“定义整型变量”的问题,而是类型约束在运行时被触发。
- 直接写
$count = 42;,PHP 自动识别为int - 用
var_dump($count);可确认类型是int(42) - 若想强制转成整型,用
(int)强制转换或intval()函数,比如$num = (int) "123abc"; // 得到 123 - 注意:空字符串
""、null、false转成 int 都是0,容易误判
什么时候会意外丢失整型?
整型“变质”往往不是定义出错,而是运算或外部输入导致隐式类型提升或截断。
-
json_decode()默认把 JSON 数字全转成float,哪怕它是123;加第二个参数true才保持整型:json_decode($json, true) - 数据库字段是
BIGINT(如 MySQL 的8-byteID),而 PHP 32 位环境里int最大只到2147483647,超出部分会变成float,再用is_int()判断就返回false - HTTP 查询参数如
?id=123,$_GET['id']永远是string,必须手动转换:$id = (int) $_GET['id']; - 用
==比较时会发生类型松散转换,0 == "abc"居然为true;判断整型值请用===或先is_int()校验
PHP 8.1+ 的 int 类型声明只用于函数/属性,不用于变量定义
类型声明是给 IDE 和静态分析工具看的,也参与运行时检查(仅限属性和函数参数/返回值),但它不改变变量定义方式。
立即学习“PHP免费学习笔记(深入)”;
- 函数参数声明:
function add(int $a, int $b): int { return $a + $b; }—— 调用时传字符串会报TypeError - 类属性声明:
public int $score = 0;—— 赋值$obj->score = "95";会立即报错 - 但局部变量仍无声明语法:
int $x = 10;是语法错误,PHP 不支持 - 类型声明不影响性能,但开启
zend.assertions = 1且用了assert(is_int($x))才有运行时开销
检查一个变量是不是整型,别只靠 is_numeric()
is_numeric("123") 返回 true,但它也接受 "12.3"、"-5"、甚至 "0x1A",根本不能等价于“是整型”。
- 准确判断用
is_int($var):只对真正类型为integer的变量返回true - 如果变量可能来自字符串输入,先转再判:
$val = (int) $input; if ($val != 0 || $input === "0") { /* 注意 "0" 要单独处理 */ } - 更稳妥的校验(尤其 API 入参):
filter_var($input, FILTER_VALIDATE_INT) !== false,它能拒绝"123abc"和"12.3" -
gettype($var) === "integer"和is_int()行为一致,但前者多一次字符串比较,没必要
整型在 PHP 里最常出问题的地方,从来不是“怎么定义”,而是“从哪来的没看清”——JSON、DB、GET/POST、序列化数据,每个入口都可能悄悄塞进来一个 float 或 string。盯住源头,比纠结语法更重要。











