(PHP 5 >= 5.2.0, PHP 7, PHP 8)
DOMDocument::registerNodeClass — Регистрация расширенного класса, используемого для создания типа базового узла
$baseClass
, ?string $extendedClass
): boolЭтот метод позволяет зарегистрировать свой собственный расширенный класс DOM, который будет использоваться впоследствии модулем PHP DOM.
Этот метод не является частью стандарта DOM.
baseClass
Класс DOM, который вы хотите расширить. Список таких классов можно увидеть во введении.
extendedClass
Имя расширенного класса. Если передать null
, будут удалены все
ранее зарегистрированные классы, расширяющие базовый класс
baseClass
.
Возвращает true
в случае успешного выполнения или false
в случае возникновения ошибки.
Пример #1 Добавление нового метода в класс DOMElement для упрощения кода
<?php
class myElement extends DOMElement {
function appendElement($name) {
return $this->appendChild(new myElement($name));
}
}
class myDocument extends DOMDocument {
function setRoot($name) {
return $this->appendChild(new myElement($name));
}
}
$doc = new myDocument();
$doc->registerNodeClass('DOMElement', 'myElement');
// С этих пор добавление одного элемента к другому
// требует всего одного вызова метода!
$root = $doc->setRoot('root');
$child = $root->appendElement('child');
$child->setAttribute('foo', 'bar');
echo $doc->saveXML();
?>
Результат выполнения данного примера:
<?xml version="1.0"?> <root><child foo="bar"/></root>
Пример #2 Получение элементов в виде пользовательского класса
<?php
class myElement extends DOMElement {
public function __toString() {
return $this->nodeValue;
}
}
$doc = new DOMDocument;
$doc->loadXML("<root><element><child>text in child</child></element></root>");
$doc->registerNodeClass("DOMElement", "myElement");
$element = $doc->getElementsByTagName("child")->item(0);
var_dump(get_class($element));
// Воспользуемся __toString методом..
echo $element;
?>
Результат выполнения данного примера:
string(9) "myElement" text in child
Пример #3 Получение имени документа владельца
Когда создаётся экземпляр расширенного класса DOMDocument, свойство ownerDocument будет ссылаться на создаваемый объект. Однако если удалить все ссылки на этот класс, он будет уничтожен, а вместо него будет создан новый объект DOMDocument. По этой причине вы можете использовать функцию DOMDocument::registerNodeClass() применительно к объекту DOMDocument.
<?php
class MyDOMDocument extends DOMDocument {
}
class MyOtherDOMDocument extends DOMDocument {
}
// Создаём MyDOMDocument с некоторым XML-содержимым
$doc = new MyDOMDocument;
$doc->loadXML("<root><element><child>text in child</child></element></root>");
$child = $doc->getElementsByTagName("child")->item(0);
// Текущий владелец узла - MyDOMDocument
var_dump(get_class($child->ownerDocument));
// Уничтожаем MyDOMDocument
unset($doc);
// И создаём новый экземпляр DOMDocument
var_dump(get_class($child->ownerDocument));
// Импортируем узел из MyDOMDocument
$newdoc = new MyOtherDOMDocument;
$child = $newdoc->importNode($child);
// Регистрируем пользовательский DOMDocument
$newdoc->registerNodeClass("DOMDocument", "MyOtherDOMDocument");
var_dump(get_class($child->ownerDocument));
unset($doc);
// Новый владелец узла изменился на MyOtherDOMDocument
var_dump(get_class($child->ownerDocument));
?>
Результат выполнения данного примера:
string(13) "MyDOMDocument" string(11) "DOMDocument" string(18) "MyOtherDOMDocument" string(18) "MyOtherDOMDocument"
Пример #4 Пользовательские объекты временны
Объекты зарегистрированных классов узлов являются временными, т.е. они уничтожаются, когда на них больше не ссылаются из кода PHP и воссоздаются при повторном извлечении. Это означает, что значения настраиваемых свойств будут потеряны после восстановления.
<?php
class MyDOMElement extends DOMElement
{
public $myProp = 'значение по умолчанию';
}
$doc = new DOMDocument();
$doc->registerNodeClass('DOMElement', 'MyDOMElement');
$node = $doc->createElement('a');
$node->myProp = 'изменённое значение';
$doc->appendChild($node);
echo $doc->childNodes[0]->myProp, PHP_EOL;
unset($node);
echo $doc->childNodes[0]->myProp, PHP_EOL;
?>
Результат выполнения данного примера:
изменённое значение значение по умолчанию