Как мне расширить DOMNode, из этого расширения DOMDocument и из него создать собственное расширение документа?
В PHP у нас нет множественного наследования. Это означает, что то, что вы пытаетесь сделать, невозможно в PHP. Причина в том, что DOMDocument расширяется от DOMNode (как и DOMElement, DOMAttr, DOMText и т. д.), поэтому этот путь наследования уже завершен (DaveRandom объяснил это более подробно и, вероятно, лучше сформулировано в своем ответе, если вам интересно, я имею в виду то же самое).
В PHP 5.4 ситуация немного улучшилась, так как вы можете поместить код, общий для всех ваших подтипов (например, код, который вы должны были поместить в ваш DOMNode) в черты.
Затем каждый создаваемый вами подтип может использовать эти черты (вы скоро увидите пример).
Если вы дополнительно хотите сделать их даже типами вашего DOMNode, вы также можете определить пустой интерфейс, который затем реализуете со всеми вашими подтипами.
Ниже приведен пример этой техники из примерной библиотеки парсинга:
class ScraperDoc extends DOMDocument implements ScraperNodeType
{
use ScraperNodeTrait;
...
Как видно, он реализует интерфейс (ScraperNodeType
), а также трейт (ScraperNodeTrait
).
Итак, интерфейс:
/**
* Empty Interface for typing reasons (instanceof operator and traits
* work not well, this interface cures that limitation a bit)
*/
interface ScraperNodeType
{
}
И есть черта; Если вы новичок в трейтах, вот пример кода, трейта с одним методом, который предоставляет строковый контекст для всех узлов, реализующих трейт (просто для того, чтобы дать представление, он сокращен из оригинальной библиотеки):
Trait ScraperNodeTrait
{
public function __toString()
{
/* @var $this DOMNode */
return trim($this->textContent);
}
}
Это не так плавно, как с трейтами/миксинами в Ruby, но настолько близко, насколько это возможно (пока с нединамическим кодом) в PHP.
Это еще не решает всех проблем в создании собственной иерархии, но я думаю, вы должны знать об этой технике (трейты + пустой интерфейс).
Вот диаграмма наследования, которая показывает DOMNode
сверху, затем расширенные типы из расширения PHP DOM, затем их расширения пользователя и их отношения к трейту (слева внизу) и интерфейсу (справа внизу).
Cluser в правой части связан с итераторами и simplexml, которые не являются частью этого ответа, поэтому не представляют прямого интереса. Хотя это показывает, например, что вы не можете перегружать DOMNodeList
в PHP. С SimpleXML возможны некоторые безумные ходы, поэтому в этой библиотеке он также является частью общей картины.
Затем в левом нижнем углу вы найдете ссылку на Net_URL2, который на данный момент является лучшим классом PHP URL. Библиотека расширяется от него, чтобы иметь собственный тип URL, а внешняя библиотека, по крайней мере, наложена на кодовую базу.
Пример библиотеки парсинга на основе диаграммы наследования DOMDocument (полный размер)
Я надеюсь, что это поможет, а также даст некоторое вдохновение. В прошлый раз я отвечал на вопрос о расширении DOMDocument о том, что DOMDocument является моделью, а не вашей моделью:
person
hakre
schedule
26.06.2013