扩展 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:返回对象的问题的主要内容,如果未能解决你的问题,请参考以下文章