array ( 0 => 'index.php', 1 => 'PHP Manual', ), 'head' => array ( 0 => 'UTF-8', 1 => 'pt_BR', ), 'this' => array ( 0 => 'domdocument.registernodeclass.php', 1 => 'DOMDocument::registerNodeClass', ), 'up' => array ( 0 => 'class.domdocument.php', 1 => 'DOMDocument', ), 'prev' => array ( 0 => 'domdocument.prepend.php', 1 => 'DOMDocument::prepend', ), 'next' => array ( 0 => 'domdocument.relaxngvalidate.php', 1 => 'DOMDocument::relaxNGValidate', ), 'alternatives' => array ( ), 'source' => array ( 'lang' => 'pt_BR', 'path' => 'reference/dom/domdocument/registernodeclass.xml', ), ); $setup["toc"] = $TOC; $setup["toc_deprecated"] = $TOC_DEPRECATED; $setup["parents"] = $PARENTS; manual_setup($setup); ?>
(PHP 5 >= 5.2.0, PHP 7, PHP 8)
DOMDocument::registerNodeClass — Registra uma classe estendida usada para criar um tipo de nó base
Este método permite registrar sua própria classe DOM estendida para ser usada posteriormente pela extensão PHP DOM.
Este método não faz parte do padrão DOM.
O construtor dos objetos das classes de nó registradas não é chamado.
baseClass
A classe DOM que você deseja estender. Você pode encontrar uma lista dessas classes na introdução ao capítulo.
extendedClass
O nome da sua classe estendida. Se null
for fornecido, qualquer classe
previamente registrada estendendo baseClass
será
removida.
Exemplo #1 Adicionando um novo método a DOMElement para facilitar nosso código
<?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');
// A partir de agora, adicionar um elemento a outro custa apenas uma chamada de método!
$root = $doc->setRoot('root');
$child = $root->appendElement('child');
$child->setAttribute('foo', 'bar');
echo $doc->saveXML();
?>
O exemplo acima produzirá:
<?xml version="1.0"?> <root><child foo="bar"/></root>
Exemplo #2 Recuperando elementos como uma classe personalizada
<?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));
// E aproveite o método __toString..
echo $element;
?>
O exemplo acima produzirá:
string(9) "myElement" text in child
Exemplo #3 Recuperando o documento proprietário
Ao instanciar um DOMDocument personalizado, a propriedade ownerDocument se referirá à classe instanciada. No entanto, se todas as referências a essa classe forem removidas, ela será destruída e um novo DOMDocument será criado. Por esse motivo, você pode usar DOMDocument::registerNodeClass() com DOMDocument
<?php
class MyDOMDocument extends DOMDocument {
}
class MyOtherDOMDocument extends DOMDocument {
}
// Crie MyDOMDocument com algum XML
$doc = new MyDOMDocument;
$doc->loadXML("<root><element><child>text in child</child></element></root>");
$child = $doc->getElementsByTagName("child")->item(0);
// O proprietário atual do nó é MyDOMDocument
var_dump(get_class($child->ownerDocument));
// MyDOMDocument é destruído
unset($doc);
// E uma nova instância DOMDocument é criada
var_dump(get_class($child->ownerDocument));
// Importe um nó de MyDOMDocument
$newdoc = new MyOtherDOMDocument;
$child = $newdoc->importNode($child);
// Registre DOMDocument personalizado
$newdoc->registerNodeClass("DOMDocument", "MyOtherDOMDocument");
var_dump(get_class($child->ownerDocument));
unset($doc);
// Nova instância MyOtherDOMDocument é criada
var_dump(get_class($child->ownerDocument));
?>
O exemplo acima produzirá:
string(13) "MyDOMDocument" string(11) "DOMDocument" string(18) "MyOtherDOMDocument" string(18) "MyOtherDOMDocument"
Exemplo #4 Objetos personalizados são transitórios
Objetos das classes de nó registradas são transitórios, ou seja, eles são destruídos quando não são mais referenciados pelo código PHP e recriados ao serem recuperados novamente. Isso implica que os valores das propriedades personalizadas serão perdidos após a recriação.
<?php
class MyDOMElement extends DOMElement
{
public $myProp = 'default value';
}
$doc = new DOMDocument();
$doc->registerNodeClass('DOMElement', 'MyDOMElement');
$node = $doc->createElement('a');
$node->myProp = 'modified value';
$doc->appendChild($node);
echo $doc->childNodes[0]->myProp, PHP_EOL;
unset($node);
echo $doc->childNodes[0]->myProp, PHP_EOL;
?>
O exemplo acima produzirá:
modified value default value