我目前正在尝试基于 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 如何访问彼此的内部存储/引用?
我希望我刚刚错过了一些明显的东西,因为看起来这应该很容易弄清楚。如果有人可以将我指向某个我可以看到有效实现的地方,那也足以作为答案。