DOMDocument::registerNodeClass
(PHP 5 >= 5.2.0, PHP 7)
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::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
$newdoc = new myOtherDOMDocument;
$child = $newdoc->importNode($child);
// Новый владелец узла изменился на myOtherDOMDocument
var_dump(get_class($child->ownerDocument));
?>
Результат выполнения данного примера:
string(13) "myDOMDocument" 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;
?>
Результат выполнения данного примера:
измененное значение значение по умолчанию