Я пытаюсь расширить класс 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. Но очевидно если я запишу класс (myDOMNode), который расширяет DOMNode, то я не смогу использовать эти два дополнительных метода на узлах, возвращенных myDOMDocument, потому что они - DOMNode (и не myDOMNode) объекты.
Я - скорее новичок в объектном программировании, я попробовал различные идеи, но они все приводят к тупику.
Какие-либо подсказки? Большое спасибо заранее.
Попробуйте использовать инкапсуляцию вместо наследования. То есть вместо написания класса, расширяющего собственный класс 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));
}
}
Не уверен, что понимаю, что вы делаете. Возможно, вам следует создать некоторый класс myDOMXPath, расширяющий DOMXPath, который будет возвращать объекты моих* классов и использовать его там, где это необходимо.