Расширение 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) объекты.

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

Какие-либо подсказки? Большое спасибо заранее.

5
задан Nicolas Le Thierry d'Ennequin 4 April 2010 в 07:18
поделиться

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));
   }
}
2
ответ дан 15 December 2019 в 00:55
поделиться

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

0
ответ дан 15 December 2019 в 00:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: