Расширение DOMDocument и DOMNode: проблема с возвращаемым объектом - PullRequest
5 голосов
/ 04 апреля 2010

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

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

Есть намеки? Большое спасибо заранее.

Ответы [ 3 ]

2 голосов
/ 20 апреля 2010

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

Используйте registerNodeClass, который заставит документ всегда возвращать узлы как ваш класс вместо DOMElement по умолчанию

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

0 голосов
/ 20 апреля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...