PHP 8.4.1 Released!

DOMDocument::registerNodeClass

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

DOMDocument::registerNodeClass Регистрирует производный пользовательский класс, через который создаётся тип базового узла

Описание

public DOMDocument::registerNodeClass(string $baseClass, ?string $extendedClass): true

Метод регистрирует пользовательский класс, который расширяет класс 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;

?>

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

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

Добавить

Примечания пользователей 2 notes

up
4
crh3675 at gmail dot com
15 years ago
Creating innerHTML and outerHTML

<?php

class DOMHTMLElement extends DOMElement
{
function
__construct() { parent::__construct();}

public function
innerHTML()
{
$doc = new DOMDocument();
foreach (
$this->childNodes as $child){
$doc->appendChild($doc->importNode($child, true));
}
$content = $doc->saveHTML();
return
$content;
}

public function
outerHTML()
{
$doc = new DOMDocument();
$doc->appendChild($doc->importNode($this, true));
$content = $doc->saveHTML();
return
$content;
}
}

$dom = DOMDocument::loadHTMLFile($file);
$dom->registerNodeClass('DOMElement','DOMHTMLElement');

if(
$dom)
{
$xpath = new DOMXpath($dom);
$regions = $xpath->query("//*[contains(@class, 'editable')]");
$content = '';

foreach(
$regions as $region){
$content .= $region->outerHTML();
}

return
$content;

}else{
throw new
Exception('Cannot parse HTML. Please verify the syntax is correct.');
}
?>
up
1
arnold at adaniels dot nl
15 years ago
Note than save and saveXML are not affected by __toString().
To Top