报错函数是test(),第1个参数期望int类型,实际传入string。需检查调用处传参来源(如$_GET、数据库返回值等),并用(int)或intval()显式转换。

查清报错函数和参数编号
看到 Argument #1 ($value) must be of type int, string given 这类报错,第一件事不是改代码,而是看清楚三件事:哪个函数(test()?date()?mysqli_select_db()?)、第几个参数(#1 还是 #2)、期望什么类型(int、array、mysqli?)、实际传了什么(string、float、NULL?)。堆栈里会明确写出调用链,比如 think\Middleware::import() 报错,就说明问题出在中间件配置文件加载环节,不是业务逻辑。
检查传参值的来源和类型
PHP 的类型错误大多源于「你以为它是整数,其实它是字符串」这类隐式转换残留。常见场景包括:
-
$_GET['id']或$_POST['count']直接传给要求int的函数——它们永远是string,得用(int)或intval()显式转换 - 数据库查询返回的字段没做类型处理,比如 MySQL 的
TINYINT(1)在 PHP 中可能被当作string或bool返回,尤其用mysqli_fetch_assoc()时 - 配置文件里用了短标签
但short_open_tag = Off,导致include('middleware.php')实际返回1(int),而不是预期的array -
time() + 0.5这种运算结果是float,但date()的第二个参数只接受int或null
修复方式取决于是否启用了 strict_types
如果文件开头有 declare(strict_types=1);,PHP 不会帮你自动转类型,必须严格匹配;如果没有,它会尝试隐式转换(比如把 '123' 转成 123),但这种行为不可靠,且从 PHP 8 开始很多内部函数已禁用自动转换。
稳妥做法是主动控制:
- 对数字型参数:用
(int)$val或filter_var($val, FILTER_VALIDATE_INT),后者还能校验范围 - 对数组型参数:用
is_array($val)判断,避免传入NULL或1(比如短标签失效时) - 对资源型参数(如
mysqli对象):确认前一步初始化成功,不要把连接字符串当连接资源传 - 对可为空的参数:函数声明中写成
?int,传NULL才合法;否则就别传NULL
注意 PHP 版本和扩展行为差异
PHP 8.0+ 对类型约束更严格,很多以前只警告的地方现在直接报 Fatal error。例如:
-
fclose()在 PHP 8.2 要求参数必须是 resource,传STDOUT前得先用is_resource()检查 -
mysqli_select_db()的第一个参数必须是mysqli实例,不能是字符串(旧版可能容忍,新版直接 TypeError) -
date()的时间戳参数从 PHP 7.4 起明确拒绝float,哪怕只是time() + 0.0
这类问题往往不是你代码写错了,而是升级 PHP 后底层契约变了——别绕开类型检查,老老实实补类型断言或转换。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











