Я пытаюсь расширить класс 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)); } }
Используйте registerNodeClass, который заставит документ всегда возвращать узлы в качестве вашего класса вместо стандартного DOMElement
Не уверен, что я понимаю, что вы делаете. Вероятно, вам следует создать некоторый класс. MyDOMXPath расширяет DOMXPath, который будет возвращать объекты моих * классов и использовать их там, где это необходимо.