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

Posted

技术标签:

【中文标题】扩展 DOMDocument 和 DOMNode:返回对象的问题【英文标题】:Extending DOMDocument and DOMNode: problem with return object 【发布时间】: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)对象。

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

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

【问题讨论】:

【参考方案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* 类的对象并在需要的地方使用它。

【讨论】:

以上是关于扩展 DOMDocument 和 DOMNode:返回对象的问题的主要内容,如果未能解决你的问题,请参考以下文章

什么会导致 DOMNode::nodeValue 为空?

报错 DOMDocument not found

仅输出特定节点 PHP XML

this.domNode 为空

如何将 HTML 插入 PHP DOMNode?

用 PHP 的 DOM 类替换 DOMNode