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