扩展DOMDocument和DOMNode:返回对象的问题

时间:2010-04-04 07:18:47

标签: php oop dom domdocument

我正在尝试扩展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)对象。

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

任何提示?非常感谢。

3 个答案:

答案 0 :(得分: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));
   }
}

答案 1 :(得分:2)

使用registerNodeClass,它将使文档始终作为您的类返回节点,而不是默认的DOMElement

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

答案 2 :(得分:0)

不确定我明白你在做什么。可能你应该创建一些类myDOMXPath扩展DOMXPath,它将返回我的*类的对象并在需要的地方使用它。