1

私は現在、DOM に基づいて大まかに PHP でツリーのようなデータ構造を実装しようとしています。ここまでで、Node と NodeList の 2 つのインターフェースを定義しました。いくつかの簡略化されたバージョンを次に示します。

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();

ただし、問題が 1 つあります。インターフェイスを PHP の DOM インターフェイスに基づいたものにしたかった理由は、NodeList のインターフェイスを縮小して、ノード自体の知識なしにツリー構造が変更されないようにしたかったからです。したがって、すべての子の追加または削除は Node で実行され、格納されたデータの構造が NodeList の操作によって誤ったものにならないようにします。

では、Node::childNodes() が呼び出されると、その実装で NodeList をどのように作成する必要があるでしょうか? PHPのドキュメントを検索して調べました。

DOMNodeList にノードを追加/削除するためのパブリック インターフェイスはありません。では、DOMNode は子ノードを独自の childNodes プロパティにどのように追加/削除するのでしょうか? DOMNodeList を拡張しない限り、DOMNode は保護されたプロパティ/メソッドにアクセスできませんでした。DOMNodeList が単に参照する子ノードの配列を DOMNode が実際に保持している場合、DOMNodeList はどのようにしてそれにアクセスできるのでしょうか? 親 DOMNode への参照を追加するメソッドはありません。この参照が存在したとしても、DOMNode のインターフェースを介して子ノードの配列にアクセスする方法はありません。

したがって、質問は次のように要約できると思います。

インターフェースがないように見える場合、NodeLists と Nodes はどのようにして互いの内部ストレージ/参照にアクセスしますか?

これは簡単に理解できるはずなので、明らかなことを見逃していることを願っています。誰かが私をどこかに向けて、動作する実装を見ることができれば、それも答えとして十分です.

4

0 に答える 0