DOM DOMDocument::registerNodeClass

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

DOMDocument::registerNodeClass — 기본 노드 유형을 생성하는 데 사용되는 확장 클래스 등록


설명

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

이 메서드는 사용하면 나중에 PHP DOM 확장에서 사용할 확장 DOM 클래스를 등록할 수 있습니다.

이 메서드는 DOM 표준의 일부가 아닙니다.


매개변수

baseClass
확장하려는 DOM 클래스입니다. 장 소개에서 이러한 클래스 목록을 찾을 수 있습니다.
extendedClass
확장된 클래스 이름입니다. null이 제공되면 baseClass를 확장하는 이전에 등록된 클래스가 제거됩니다.

반환 값

성공하면 true를, 실패하면 false를 반환합니다.


Examples

예제 #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');

// 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();

?>
                  
                

위의 예는 다음을 출력합니다.

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

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

위의 예는 다음을 출력합니다.

string(9) "myElement"
text in child
                

예제 #3 소유자 문서 검색

사용자 정의 DOMDocument를 인스턴스화할 때 ownerDocument 속성은 인스턴스화된 클래스를 참조합니다. 그러나 해당 클래스에 대한 모든 참조가 제거되면 해당 클래스는 소멸되고 대신 새 DOMDocument가 생성됩니다. 그런 이유로 DOMDocument::registerNodeClass()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));
?>
                  
                

위의 예는 다음을 출력합니다.

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

예제 #4 사용자 정의 개체는 일시적입니다.

주의 등록된 노드 클래스의 객체는 일시적입니다. 즉, PHP 코드에서 더 이상 참조되지 않으면 소멸되고 다시 검색할 때 다시 생성됩니다. 이는 사용자 정의 속성 값이 재생성 후에 손실됨을 의미합니다.

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

위의 예는 다음을 출력합니다.

modified value
default value