DOMDocument::registerNodeClass

(PHP 5 >= 5.2.0, PHP 7)

DOMDocument::registerNodeClass Регистрация расширенного класса, используемого для создания типа базового узла

Описание

public DOMDocument::registerNodeClass ( string $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]->myPropPHP_EOL;
unset(
$node);
echo 
$doc->childNodes[0]->myPropPHP_EOL;
?>

Результат выполнения данного примера:

измененное значение
значение по умолчанию