5

XPathの選択を容易にするために、DOMDocumentクラスを拡張しようとしています。私はこのコードを書きました:

class myDOMDocument extends DOMDocument {

 function selectNodes($xpath){
   $oxpath = new DOMXPath($this);
    return $oxpath->query($xpath);
  }

  function selectSingleNode($xpath){
   return $this->selectNodes($xpath)->item(0);
  }
}

これらのメソッドは、それぞれDOMNodeListオブジェクトとDOMNodeオブジェクトを返します。私が今やりたいのは、DOMNodeオブジェクトと同様のメソッドを実装することです。ただし、DOMNodeを拡張するクラス(myDOMNode)を作成した場合、これらの2つのメソッドはDOMNode(myDOMNodeではない)オブジェクトであるため、myDOMDocumentによって返されるノードで使用できなくなります。

私はオブジェクトプログラミングの初心者で、さまざまなアイデアを試しましたが、それらはすべて行き詰まりにつながります。

ヒントはありますか?よろしくお願いします。

4

3 に答える 3

2

継承の代わりにカプセル化を使用してみてください。つまり、ネイティブDOMNodeクラスを拡張するクラスを作成する代わりに、クラスを作成すると、その中にDOMNodeのインスタンスが格納され、必要なメソッドのみが提供されます。

これにより、DOMNodeをMyNodeに効果的に変換するコンストラクターを作成できます。

class MyNode {
   function __construct($node) {
      $this->node = $node;
   }

   // (other helpful methods)

}

クラスMyDocumentの場合、DOMNodeオブジェクトではなくMyNodeオブジェクトを出力します。

class MyDocument {

   // (other helpful methods)

   function selectSingleNode($xpath) {

      return new MyNode($this->selectNodes($xpath)->item(0));
   }
}
于 2010-04-20T02:31:36.597 に答える
2

registerNodeClassを使用すると、ドキュメントはデフォルトのDOMElementではなく常にノードをクラスとして返します。

http://php.net/manual/en/domdocument.registernodeclass.php

于 2017-01-23T19:24:05.597 に答える
0

何をしているのかわかりません。おそらく、myDOMXPathはDOMXPathを拡張するクラスを作成する必要があります。これは、my *クラスのオブジェクトを返し、必要な場所で使用します。

于 2010-04-19T21:15:23.650 に答える