DOMDocument::registerNodeClass
(PHP 5 >= 5.2.0, PHP 7)
DOMDocument::registerNodeClass — 基底ノード型を作成する際に使用する拡張クラスを登録する
説明
public DOMDocument::registerNodeClass
( string $baseclass
, string $extendedclass
) : bool
このメソッドにより、独自に拡張した DOM クラスを登録することができます。 これを、後で PHP DOM 拡張モジュールで使用します。
このメソッドは、DOM の標準にはないものです。
パラメータ
baseclass
- 拡張したい DOM クラス。クラス名の一覧は、 この章の導入部にあります。
extendedclass
- 拡張したクラスの名前。
null
を渡した場合は、 それまでにbaseclass
を拡張して作成したすべてのクラスが削除されます。
返り値
成功した場合に true
を、失敗した場合に false
を返します。
例
例1 新しいメソッドを DOMElement に追加し、コードを書きやすくする
<?phpclass 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 カスタムクラス形式での要素の取得
<?phpclass 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 オーナードキュメントの取得
自作の DOMDocument インスタンスを作成すると、
ownerDocument
プロパティが作成元のクラスを指すようになります。
つまり DOMDocument の
DOMDocument::registerNodeClass() を使う必要はない
(実際、使えない) ということです。
<?phpclass myDOMDocument extends DOMDocument {}class myOtherDOMDocument extends DOMDocument {}// XML から myDOMDocument を作成します$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 からインポートします$newdoc = new myOtherDOMDocument;$child = $newdoc->importNode($child);// ノードの新しいオーナーは myOtherDOMDocument に変わりましたvar_dump(get_class($child->ownerDocument));?>
上の例の出力は以下となります。
string(13) "myDOMDocument" string(18) "myOtherDOMDocument"
例4 カスタムオブジェクトは一時的なもの
警告 登録されたノードクラスは、一時的なものです。 つまり、PHPコードから参照されなくなった時には破棄され、 再度取得される際に再生成されます。 これは、カスタムプロパティの値は再生成された時に失われるということです。
<?phpclass 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