DOMDocument::registerNodeClass

Register extended class used to create base node type

&reftitle.description; public `bool` `DOMDocument::registerNodeClass` `string` `baseClass` ``string``null```extendedClass`

This method allows you to register your own extended DOM class to be used afterward by the PHP DOM extension.

This method is not part of the DOM standard.

The constructor of the objects of the registered node classes is not called.

&reftitle.parameters;

`baseClass`

- The DOM class that you want to extend. You can find a list of these classes in the chapter introduction.

`extendedClass`

- Your extended class name. If &null; is provided, any previously registered class extending `baseClass` will be removed.

&reftitle.returnvalues;

&return.success;

&reftitle.examples;

### Adding a new method to DOMElement to ease our code

    <?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');

    // From now on, adding an element to another costs only one method call !
    $root = $doc->setRoot('root');
    $child = $root->appendElement('child');
    $child->setAttribute('foo', 'bar');

    echo $doc->saveXML();

    ?>

&example.outputs;

    <?xml version="1.0"?>
    <root><child foo="bar"/></root>

### Retrieving elements as custom class

    <?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));

    // And take advantage of the __toString method..
    echo $element;
    ?>

&example.outputs;

    string(9) "myElement"
    text in child

### Retrieving owner document

When instantiating a custom `DOMDocument` the `ownerDocument` property will refer to the instantiated class. However, if all references to that class are removed, it will be destroyed and new `DOMDocument` will be created instead. For that reason you might use `DOMDocument::registerNodeClass` with `DOMDocument`

    <?php
    class MyDOMDocument extends DOMDocument {
    }

    class MyOtherDOMDocument extends DOMDocument {
    }

    // Create MyDOMDocument with some XML
    $doc = new MyDOMDocument;
    $doc->loadXML("<root><element><child>text in child</child></element></root>");

    $child = $doc->getElementsByTagName("child")->item(0);

    // The current owner of the node is MyDOMDocument
    var_dump(get_class($child->ownerDocument));
    // MyDOMDocument is destroyed
    unset($doc);
    // And new DOMDocument instance is created
    var_dump(get_class($child->ownerDocument));

    // Import a node from MyDOMDocument
    $newdoc = new MyOtherDOMDocument;
    $child = $newdoc->importNode($child);

    // Register custom DOMDocument
    $newdoc->registerNodeClass("DOMDocument", "MyOtherDOMDocument");

    var_dump(get_class($child->ownerDocument));
    unset($doc);
    // New MyOtherDOMDocument is created
    var_dump(get_class($child->ownerDocument));
    ?>

&example.outputs;

    string(13) "MyDOMDocument"
    string(11) "DOMDocument"
    string(18) "MyOtherDOMDocument"
    string(18) "MyOtherDOMDocument"

### Custom objects are transient

Objects of the registered node classes are transient, i.e. they are destroyed when they are no longer referenced from PHP code, and recreated when being retrieved again. That implies that custom property values will be lost after recreation.

    <?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;
    ?>

&example.outputs;

    modified value
    default value