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