5

我正在尝试扩展 DOMDocument 类,以使 XPath 选择更容易。我写了这段代码:

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),我将无法在 myDOMDocument 返回的节点上使用这两个额外的方法,因为它们是 DOMNode(而不是 myDOMNode)对象。

我是对象编程的初学者,我尝试了各种想法,但它们都导致了死胡同。

有什么提示吗?提前非常感谢。

4

3 回答 3

2

尝试使用封装而不是继承。也就是说,与其编写扩展原生 DOMNode 类的类,不如编写一个在其中存储 DOMNode 实例的类,并仅提供您需要的方法。

这允许您编写一个有效地将 DOMNode 转换为 MyNode 的构造函数:

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

   // (other helpful methods)

}

对于您的 MyDocument 类,您输出 MyNode 对象而不是 DOMNode 对象:

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 回答