1

我目前正在尝试基于 DOM 在 PHP 中松散地实现树状数据结构。到目前为止,我已经定义了两个接口,Node 和 NodeList。以下是一些简化版本:

interface Node {

    public function hasChildNodes();

    public function childNodes();

    public function parentNode();

    public function hasParentNode();

    public function nodeValue();

    public function appendChild($name, Node $node);

    public function removeChild($name);
}

interface NodeList {

    public function size();

    public function item(); 
}

这是它如何工作的一个简单示例:

$node = new Node($someValue);
$node->appendChild(new Node($anotherValue));
$nodelist = $node->childNodes();

但是,有一个问题。我之所以想将接口基于 PHP 的 DOM 接口,是因为我想确保 NodeLists 具有简化的接口,以防止在节点本身不知情的情况下更改树结构。因此,所有子节点的添加或删除都在节点上执行,确保存储的数据结构不会因操作节点列表而出错。

那么当 Node::childNodes() 被调用时,它应该如何在它的实现中创建一个 NodeList 呢?我搜索了PHP文档以找出答案。

没有用于从 DOMNodeList 中添加/删除节点的公共接口。那么 DOMNode 如何将子节点附加/删除到它自己的 childNodes 属性?DOMNode 无法访问受保护的属性/方法,除非它扩展了 DOMNodeList。如果 DOMNode 实际上包含 DOMNodeList 简单引用的子节点数组,那么 DOMNodeList 是如何访问它的呢?没有添加对父 DOMNode 的引用的方法。即使存在此引用,也无法通过 DOMNode 的接口访问所述子节点数组。

所以我想这个问题可以总结如下:

当似乎没有接口可以访问时,NodeLists 和 Nodes 如何访问彼此的内部存储/引用?

我希望我刚刚错过了一些明显的东西,因为看起来这应该很容易弄清楚。如果有人可以将我指向某个我可以看到有效实现的地方,那也足以作为答案。

4

0 回答 0