【问题标题】:Extending DOMDocument and DOMNode: problem with return object扩展 DOMDocument 和 DOMNode:返回对象的问题
【发布时间】:2011-02-04 03:41:30
【问题描述】:

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

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

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

【问题讨论】:

    标签: php oop dom domdocument


    【解决方案1】:

    尝试使用封装而不是继承。也就是说,与其编写扩展原生 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));
       }
    }
    

    【讨论】:

      【解决方案2】:

      使用 registerNodeClass 这将使文档总是返回节点作为你的类,而不是默认的 DOMElement

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 2013-06-23
          • 1970-01-01
          • 2011-02-13
          • 1970-01-01
          • 2010-11-06
          • 1970-01-01
          • 2011-09-08
          • 2012-04-04
          • 2015-07-12
          相关资源
          最近更新 更多