PHP 8.3 中空数组无新增语法糖,仍需用 array[] 初始化,但配合 DOM 操作可提升类型安全与代码清晰度,如预分配容器、暂存过滤结果或模拟 NodeList 语义。

PHP 8.3 中定义空数组本身没有新增语法糖(如 array[] 是用于非空字面量的简写),但配合 DOM 扩展升级(尤其是 PHP 8.4 即将引入的 Dom\NodeList)时,合理初始化空节点集合能显著提升代码清晰度与类型安全性。
空数组在 DOM 节点操作中的典型用途
常见于预分配容器、过滤后结果暂存、或作为 Dom\NodeList 的替代占位结构(因 Dom\NodeList 尚未提供构造器,无法直接 new):
- 不建议用
new DOMNodeList()—— 它是只读、不可实例化的遗留类 - 可用空数组临时承接查询结果:
$nodes = [];,再通过foreach ($dom->getElementsByTagName('div') as $node) { $nodes[] = $node; } - 若需后续遍历+计数,可显式声明为
array<Dom\Node>(配合 PHP 8.3 类型推断和 IDE 支持)
用 array[] 替代 array() 提升可读性
PHP 8.3 支持 array[...] 语法创建索引数组,虽不改变运行时行为,但在节点处理逻辑中更直观:
-
$headers = array['h1', 'h2', 'h3'];比array('h1', 'h2', 'h3')更紧凑 - 配合 DOM 查询:
$targetNodes = array_filter($allNodes, fn($n) => in_array($n->nodeName, array['script', 'style'])); - 注意:空数组仍须写
array[],而非[](后者在严格类型上下文中可能丢失泛型提示)
为 NodeList 兼容做准备:用只读数组模拟“活列表”语义
Dom\NodeList(PHP 8.4+)是 live list,而普通数组不是。若当前项目需提前适配该模型,可借助 PHP 8.3 只读属性 + 默认值特性封装安全容器:
立即学习“PHP免费学习笔记(深入)”;
- 定义只读节点集合:
public readonly array $nodes = []; - 构造时注入(避免后期误改):
public function __construct(public readonly Dom\Document $doc) { $this->nodes = iterator_to_array($doc->getElementsByTagName('*')); } - 配合类型注解,让静态分析工具识别其内容为
Dom\Node实例
避免常见陷阱
动态添加节点到数组时,别混淆 DOM 层级与 PHP 数组层级:
- 错误:直接
$nodes[] = $dom->createElement('p');—— 节点未附加到文档,后续操作可能失效 - 正确:先
$dom->documentElement->appendChild($node),再存入数组 - 空数组初始化后,应尽快明确其元素类型,尤其在函数返回值中使用
array<Dom\Node>声明



















