我目前正在尝试在PHP中基于DOM实现一个类似Tree的数据结构。到目前为止,我已经定义了两个接口,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具有简化的接口,这使得树结构在不知道节点本身的情况下不会被改变。因此,在节点上执行所有子追加或删除,确保存储的数据结构不会因操作NodeLists而出错。
因此,当调用Node :: childNodes()时,如何在其实现中创建NodeList?我搜索了PHP文档以找出答案。
没有用于从DOMNodeList追加/删除节点的公共接口。那么DOMNode如何将子节点附加/删除到自己的childNodes属性?除非扩展DOMNodeList,否则DOMNode无法访问受保护的属性/方法。如果DOMNode实际上拥有DOMNodeList简单引用的子节点数组,那么DOMNodeList如何访问它?没有方法可以添加对父DOMNode的引用。即使存在此引用,也无法通过DOMNode的接口访问所述子节点数组。
所以我想这个问题可以归结为以下几点:
当似乎没有接口时,NodeLists和Nodes如何访问彼此的内部存储/引用?
我希望我错过了一些明显的东西,因为这似乎很容易理解。如果有人能指出某个地方,我可以看到一个有效的实施方案,这也足以作为答案。