(PHP 5 >= 5.2.0, PHP 7, PHP 8)
DOMDocument::registerNodeClass — Регистрирует производный пользовательский класс, через который создаётся тип базового узла
Метод регистрирует пользовательский класс, который расширяет класс PHP-модуля DOM и который модуль затем будет использовать, чтобы создавать базовые узлы документа.
Метод не входит в DOM-стандарт.
Конструктор объектов классов узлов, которые зарегистрировали методом, не вызывается.
baseClass
Класс модуля DOM, который требуется расширить. Список классов модуля содержит введение к главе об объектной модели документов.
extendedClass
Название пользовательского производного класса. Метод удалит классы,
которые прежде зарегистрировали как расширение базового класса baseClass
,
если передать значение null
.
Функция возвращает логическое значение true
.
Версия | Описание |
---|---|
8.4.0 | Метод DOMDocument::registerNodeClass() теперь предварительно возвращает значение true. |
Пример #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 Получение имени документа владельца
Свойство ownerDocument ссылается на экземпляр пользовательского класса, когда создают пользовательский документ DOMDocument. Модуль уничтожит объект пользовательского документа и создаст вместо него новый экземпляр класса 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;
?>
Результат выполнения приведённого примера:
изменённое значение значение по умолчанию