私は現在、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 はどのようにして互いの内部ストレージ/参照にアクセスしますか?
これは簡単に理解できるはずなので、明らかなことを見逃していることを願っています。誰かが私をどこかに向けて、動作する実装を見ることができれば、それも答えとして十分です.