strict_types=1开启后,int参数不接受字符串且不自动转换,直接抛typeerror;该声明须在文件首行,仅作用于当前文件。

strict_types=1 开启后传 string 给 int 参数直接报错
PHP 7.0+ 启用 declare(strict_types=1); 后,int 参数不再接受字符串(如 "123"),也不会自动转成整数,而是抛出 TypeError。这不是 bug,是设计行为。
常见错误现象:Fatal error: Uncaught TypeError: myFunc(): Argument #1 ($x) must be of type int, string given
- 必须在文件第一行写
declare(strict_types=1);,否则不生效 - 该声明只影响当前文件的函数调用,不影响 require/include 的其他文件
- 如果想兼容旧逻辑,别加这句;但新项目建议加,配合 IDE 提前暴露问题
- 临时绕过:调用前手动转换,比如
myFunc((int)$input),但注意(int)"abc"会变成0,可能掩盖业务逻辑错误
没开 strict_types 却收到 “Missing argument” 警告
这个警告和类型无关,是参数数量不足导致的,比如定义了两个必填参数,却只传了一个。
典型错误信息:PHP Warning: Missing argument 2 for calculate_sum() in file.php on line 3
- 检查函数定义里有没有漏掉默认值,比如把
function calc($a, $b = 0)写成function calc($a, $b) - 传
null不会触发默认值,calc(5, null)仍会进函数体,但$b是null,不是0 - 如果参数可选,优先用默认值;如果必须校验,应在函数内用
is_int($b)或isset($b)主动判断并 throw 异常
abs()、intval() 这类函数对非数字字符串返回 0,容易埋雷
PHP 8+ 中 abs("abc") 返回 0,而不是报错或 false —— 这会让本该失败的输入“静默通过”,后续逻辑可能出错。
-
abs((int)"abc")→0,但"abc"显然不是合法数字 - 更安全的做法是先用
is_numeric()或正则判断格式,再转类型:if (is_numeric($x)) { $n = (int)$x; echo abs($n); } - 注意
is_numeric("1e3")返回 true,但(int)"1e3"是1,有精度丢失风险;如需严格整数,用filter_var($x, FILTER_VALIDATE_INT)
对象方法里误加参数导致 ArgumentCountError
Getter 方法(如 getBalance())如果多写一个参数,调用时就会报 ArgumentCountError: Too few arguments,因为 PHP 认为它需要那个参数。
错误示例:function getBalance($unused) { return $this->balance; },然后调用 $obj->getBalance() 就会崩
- getter/setter 命名规范本身不强制参数,但一旦声明了就必须传
- IDE(如 PHPStorm)通常能标出这种“声明了却没用到”的参数,开启 inspection 可提前发现
- 如果真要支持条件获取(比如带缓存开关),改用可选参数 + 默认值:
function getBalance($withCache = true)
(int)$input 强转,一边又用 is_int() 判断——后者永远为 false,因为强转后仍是 int,但原意可能是想确认输入本来就是 int。这类逻辑断点必须靠单元测试覆盖,不能只靠肉眼检查。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











