Расширение DOMDocument и DOMNode: проблема с объектом возврата

Я пытаюсь расширить класс 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).

Я скорее новичок в программировании объектов, я пробовал разные идеи, но все они ведут к тупику.

Любые намеки? Заранее большое спасибо.

Solutions Collecting From Web of "Расширение DOMDocument и DOMNode: проблема с объектом возврата"

Попробуйте использовать инкапсуляцию вместо наследования. То есть вместо написания класса, который расширяет собственный класс 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

http://php.net/manual/en/domdocument.registernodeclass.php

Не уверен, что я понимаю, что вы делаете. Вероятно, вам следует создать некоторый класс. MyDOMXPath расширяет DOMXPath, который будет возвращать объекты моих * классов и использовать их там, где это необходимо.