php数组本身不受strict_types影响,仍可存储混合类型;但函数参数/返回值中的数组类型声明(如int[])在严格模式下会强制校验元素类型,而内置数组函数不自动检查元素类型。

PHP 数组本身不直接受严格类型模式(declare(strict_types=1))影响,但数组的使用方式、函数参数与返回值类型声明、以及涉及数组的操作在严格类型上下文中会表现出更明确的行为约束。
严格类型不影响数组本身的结构定义
PHP 的数组是动态、异构的数据结构,即使启用了严格类型,你依然可以创建混合类型的数组,例如:
php
declare(strict_types=1);
$mixed = [1, "hello", true, []]; // 合法,无类型错误
?>
这是因为 array 类型本身没有内建的元素类型约束。严格类型模式不强制数组元素必须为某一种类型,它只作用于函数调用时的参数类型和返回值类型检查。
立即学习“PHP免费学习笔记(深入)”;
函数参数与返回值中的数组类型声明会被严格校验
当你用类型声明(如 array、int[]、string[] 等)标注函数参数或返回值时,严格类型模式会让 PHP 在调用时执行更严格的类型匹配:
1、对ASP内核代码进行DLL封装,从而大大提高了用户的访问速度和安全性;2、采用后台生成HTML网页的格式,使程序访问速度得到进一步的提升;3、用户可发展下级会员并在下级购买商品时获得差额利润;4、全新模板选择功能;5、后台增加磁盘绑定功能;6、后台增加库存查询功能;7、后台增加财务统计功能;8、后台面值类型批量设定;9、后台财务曲线报表显示;10、完善订单功能;11、对所有传输的字符串进行安全
- 使用
array类型声明:仅要求传入的是数组,不检查内部元素类型 - 使用
int[]或string[](PHP 8.1+):要求传入的是「纯」该类型的数组,否则抛出TypeError - 返回值声明为
float[],但实际返回含字符串的数组 → 运行时报错
示例:
declare(strict_types=1);
function sumInts(int $a, int $b): int { return $a + $b; }
function getNumbers(): int[] { return [1, 2, "3"]; } // PHP 8.1+:运行时报错 TypeError
// 下面这行在调用时会失败(因传入了 string):
// sumInts(1, "2"); // TypeError: Argument #2 ($b) must be of type int, string given
?>
数组操作函数不会自动启用元素级类型检查
内置函数如 array_map、array_filter、usort 等本身没有类型签名(PHP 8 前),它们不因 strict_types 而对回调返回值或数组元素做类型校验。但如果你自己写带类型声明的回调,并在严格模式下调用,PHP 会校验回调的输入输出类型:
- 自定义回调声明
function (int $x): string,却传入["a", "b"]→TypeError -
array_map不检查结果数组是否符合某个类型,除非你显式声明返回类型并赋值给有类型提示的变量
例如:
declare(strict_types=1);
$nums = [1, 2, 3];
$strings = array_map(function(int $n): string { return (string)$n; }, $nums); // OK
// $strings 是 array,但若声明为 string[] 变量则需 PHP 8.1+ 支持
?>
最佳实践建议
- 在 PHP 8.1+ 中,优先使用
int[]、MyClass[]等精确数组形状声明,提升可读性与早期错误捕获 - 避免依赖运行时隐式转换(如
"123" + 45),尤其在数组遍历时;严格模式下不会阻止它,但可能掩盖逻辑缺陷 - 对关键业务数组,配合
assert()或静态分析工具(如 PHPStan)做元素级校验 - 注意:严格类型只作用于同一文件中声明的函数调用;跨文件调用是否严格,取决于调用方所在文件是否启用
strict_types










