PHP 7.4 类型化属性必须显式初始化,默认值只能是[];未初始化则读取时触发不可捕获的致命错误,构造函数补救不可靠,静态分析和IDE支持依赖字面量[]。

PHP 7.4 引入类型化属性后,声明空数组必须显式提供默认值,否则会触发运行时致命错误。这不是语法警告,而是直接中断执行的致命问题。
不写默认值会怎样
若只声明类型却不赋初值,例如:
private array $items;该属性处于“未初始化”状态。一旦尝试读取(如 count($this->items) 或 foreach),PHP 立即抛出:
这个错误无法被 try/catch 捕获(属于编译期/初始化阶段的致命错误),服务请求直接失败。
为什么不能靠构造函数“补救”
有人试图在 __construct() 中统一初始化,但存在两个硬伤:
- 子类重写构造函数时容易遗漏该行,导致继承链中某处仍为未初始化状态
- 静态分析工具(如 PHPStan、Psalm)无法推断构造函数一定会执行赋值,会持续报错“可能未初始化”
- IDE 补全和类型提示失效——没有默认值,编辑器无法确认该属性始终是数组
正确写法:必须带默认值且类型匹配
唯一安全、可维护、被工具链支持的方式是:
private array $items = [];注意三点:
- 等号右侧必须是字面量
[],不能是array()(PHP 7.4+ 类属性初始化仅接受短数组语法) - 类型声明
array和默认值[]必须严格对应;写成private ?array $items = [];是冗余且无效的([]不是null) - 若需允许
null,应明确使用可空联合类型:private ?array $items = null;,此时[]和null都合法,但语义完全不同
常见误操作与后果对比
以下写法看似相似,实际行为差异极大:
-
private array $items = null; → 致命错误:类型不兼容,
null不能赋给非空array - private $items = []; → 允许,但失去类型提示、静态检查和 IDE 支持
- private array $items; → 属性未初始化,首次读取即崩溃
- private array $items = [1, 2]; → 合法,但不符合“空数组”需求,且增加无谓内存占用
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











