空数组[]是合法array类型,与int/string等标量类型完全无关;strict_types=1仅约束函数参数/返回值的标量类型匹配,传[]给标量声明函数会直接TypeError,不转换。

PHP 7.0 的标量类型(int、string、float、bool)与数组是**完全不同的类型范畴**,空数组 [] 属于 复合类型(array),它既不是 int,也不是 string,更不能被当作标量参与严格模式下的参数或返回值校验。
空数组不能赋给标量类型参数或返回值
在启用 declare(strict_types=1); 的文件中,若函数签名声明了标量类型,传入空数组会直接抛出 TypeError:
-
function foo(int $x): void { }→foo([])错误:array 给 int -
function bar(string $s): void { }→bar([])错误:array 给 string - 即使数组为空,PHP 也不做任何隐式转换——严格模式下,类型必须字面匹配
int 和 string 在严格模式下互不兼容
数字字符串(如 "123")和整数(如 123)在内存表示、底层结构和语义上完全不同:
-
int是二进制整数值,参与算术运算无开销 -
string是字符序列,哪怕内容是数字,也占用更多内存、支持索引和编码操作 -
foo(123)和foo("123")在严格模式下是两种结果:前者通过,后者报错
如何安全处理可能为数组的输入?
若逻辑上需接受“数字、字符串或空数组”,不能靠标量声明兜底,而应:
立即学习“PHP免费学习笔记(深入)”;
- 使用联合类型(PHP 8.0+):
function process(mixed $input): void或function process(int|string|array $input): void - 手动类型检查:
if (is_array($input) && empty($input)) { ... } - 明确设计接口:用
null表示“无值”,用int|string表示“可解析的数值”,避免让 array 承担标量语义
常见误区提醒
不要试图用强制转换绕过严格检查:
-
(int)[]结果是0,但这是运行时转换,不是类型声明层面的兼容 -
strval([])得到"Array",而非空字符串,且违反函数签名约定 - 严格模式约束的是**调用时的实际类型**,不是转换后的值——声明即契约


















