strict_types=1必须写在文件顶部,且是第一条可执行语句,紧贴文件开头,前面不能有任何代码(包括空行、注释、BOM等)。

必须在文件顶部加 declare(strict_types=1);,且仅对当前文件的函数参数类型检查生效——不是全局开关,也不是“一加全严”。
strict_types=1 必须写在哪儿?
它得是文件中第一条可执行语句,紧贴 <?php 后面,前面不能有空行、注释或任何输出。
- ✅ 正确:
<?php declare(strict_types=1); function f(int $x) { ... } - ❌ 错误:
<?php \n// 注释\ndeclare(strict_types=1);(换行后算第二行) - ❌ 错误:
<?php echo "hello"; declare(strict_types=1);(已有输出) - ❌ 错误:
declare(strict_types=1);写在include的文件里,但主文件没写——主文件调用时仍走弱模式
为什么传 int 给 float 参数会报错?
因为 strict_types=1 禁止所有标量类型的隐式转换:整数不会自动转成浮点,字符串数字也不会转成整数,哪怕值上“看起来一样”。
-
strlen(42)→ 报TypeError:期望string,给了int -
add(5.0, 3)(函数声明为function add(int $a, int $b))→ 报错:float不等于int -
json_encode(true)不受影响:返回类型声明(如: string)本身就有运行时检查,和strict_types无关
第三方库调用不受你控制
你写了 declare(strict_types=1);,不代表 Laravel 的 cache()->get() 就会拒绝 string 当作 int 参数——它自己没声明,就还是弱模式。
立即学习“PHP免费学习笔记(深入)”;
- Laravel、Symfony 等主流库默认不启用
strict_types,为兼容旧代码 - 你传
"123"给一个期望int的第三方方法,大概率被静默转成123或0,而不是报错 - 想验证第三方行为?看它的源码文件头有没有
declare(strict_types=1);
最容易被忽略的一点:strict_types 不继承、不传播、不跨文件。哪怕你在一个核心服务类里加了它,只要调用链中间某个 require 的工具文件没加,那一段参数校验就“掉链子”。别指望靠一个声明管住整个项目。



















