在PHP中实现基于DOM的Tree数据结构。 NodeLists如何工作?

时间:2012-05-14 01:06:36

标签: php dom tree implementation nodes

我目前正在尝试在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如何访问彼此的内部存储/引用?

我希望我错过了一些明显的东西,因为这似乎很容易理解。如果有人能指出某个地方,我可以看到一个有效的实施方案,这也足以作为答案。

0 个答案:

没有答案