PHP5 : Applying a method from an extended class on an object from the original (parent) class.
        Posted  
        
            by Glauber Rocha
        on Stack Overflow
        
        See other posts from Stack Overflow
        
            or by Glauber Rocha
        
        
        
        Published on 2010-04-06T15:00:25Z
        Indexed on 
            2010/04/06
            15:03 UTC
        
        
        Read the original article
        Hit count: 469
        
Hello,
I'm trying to extend two native PHP5 classes (DOMDocument and DOMNode) to implement 2 methods (selectNodes and selectSingleNode) in order to make XPath queries easier. I thought it would be rather straighforward, but I'm stuck in a problem which I think is an OOP beginner's issue.
class nDOMDocument extends DOMDocument {
    public function selectNodes($xpath){
    $oxpath = new DOMXPath($this);
    return $oxpath->query($xpath);
  }
  public function selectSingleNode($xpath){
    return $this->selectNodes($xpath)->item(0);
  }
}
Then I tried to do extend DOMNode to implement the same methods so I can perform an XPath query directly on a node:
class nDOMNode extends DOMNode {
    public function selectNodes($xpath){
    $oxpath = new DOMXPath($this->ownerDocument,$this);
    return $oxpath->query($xpath);
  }
  public function selectSingleNode($xpath){
    return $this->selectNodes($xpath)->item(0);
  }
}
Now if I execute the following code (on an arbitrary XMLDocument):
$xmlDoc = new nDOMDocument;
$xmlDoc->loadXML(...some XML...);
$node1 = $xmlDoc->selectSingleNode("//item[@id=2]");
$node2 = $node1->selectSingleNode("firstname");
The third line works and returns a DOMNode object $node1. However, the fourth line doesn't work because the selectSingleNode method belongs to the nDOMNode class, not DOMNode. So my question: is there a way at some point to "transform" the returned DOMNode object into a nDOMNode object? I feel I'm missing some essential point here and I'd greatly appreciate your help.
(Sorry, this is a restatement of my question http://stackoverflow.com/questions/2573820/)
© Stack Overflow or respective owner