PHP 7.0 不支持可空类型声明,因其尚未引入该特性;可空类型(如 ?array)是 PHP 7.1 才正式加入的语法,7.0 仅支持单一具体类型且不识别 ?T 或 T|null,传 null 会直接报 TypeError。

PHP 7.0 不支持可空类型声明,是因为该特性尚未被引入语言规范。
可空类型(如 ?array、?string)是 PHP 7.1 才正式加入的语法特性。在 PHP 7.0 中:
- 类型声明仅支持单一具体类型:
int、string、array、bool、float、类名、接口、callable等; -
不支持任何表示“或 null”的语法:
?array会直接报语法错误,array|null在 PHP 7.0 中也不被识别(联合类型是 PHP 8.0 才支持); -
null被视为一种独立值,而非类型;当函数参数声明为array $data时,传入null会立即触发TypeError,无法绕过; - 开发者若需处理可能为
null的数组,只能放弃类型声明,改用无类型参数 + 运行时判断(如is_array($data) || $data === null),但这牺牲了类型安全和 IDE 支持。
所以,不是 PHP 7.0 “限制了”可空类型,而是它根本未定义该语法——这是版本演进的自然边界,不是设计缺陷。
简言之:PHP 7.0 的类型系统尚处于基础建设阶段,可空类型属于下一阶段的增强功能。
立即学习“PHP免费学习笔记(深入)”;
H3 可空类型真正起作用的起点是 PHP 7.1
-
?array、?int等写法从 PHP 7.1 开始合法且受运行时和静态分析工具支持; - 它允许函数明确表达“这个参数/返回值要么是数组,要么是 null”,语义清晰、错误提前暴露;
- 同时兼容严格模式(
declare(strict_types=1)),不会破坏已有类型契约。
H3 如果你还在用 PHP 7.0 并需要类似能力
- 不要尝试用
(array) null或[]模拟“空数组”来替代null,这会掩盖真实意图; - 避免在类型声明位置写
?array—— 解析器会直接报错,不是警告; - 更稳妥的做法是:升级到 PHP 7.1+,或至少 PHP 8.0+(获得完整联合类型支持);
- 若暂无法升级,可用文档注释(如
@param array|null $items)配合手动检查,但需自行承担类型误用风险。
H3 为什么 PHP 团队没在 7.0 就加入可空类型
- PHP 7.0 的核心目标是落地标量类型声明和严格模式,这是类型系统从“松散”走向“可控”的第一步;
- 可空类型属于对类型系统的二次抽象,需要更成熟的底层类型解析机制;
- 实际开发反馈显示,大量项目在 7.0 后才暴露出对
null显式建模的强需求,因此 7.1 顺势补全。
不复杂但容易忽略:可空类型不是“让 null 合法化”,而是让“null 是否属于有效输入”这件事,变成接口契约的一部分。



















