2010-04-04 23 views
4

我想扩展DOMDocument类,以便使XPath选择更容易。我写了这段代码:扩展DOMDocument和DOMNode:返回对象的问题

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)对象。

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

任何提示?提前致谢。

回答

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)); 
    } 
} 
0

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