DOMDocument::registerNodeClass 基底ノード型を作成する際に使用する拡張クラスを登録する &reftitle.description; public trueDOMDocument::registerNodeClass stringbaseClass stringnullextendedClass このメソッドにより、独自に拡張した DOM クラスを登録することができます。 これを、後で PHP DOM 拡張モジュールで使用します。 このメソッドは、DOM の標準にはないものです。 登録済みのクラスの、インスタンスのコンストラクタはコールされません。 &reftitle.parameters; baseClass 拡張したい DOM クラス。クラス名の一覧は、 この章の導入部にあります。 extendedClass 拡張したクラスの名前。&null; を渡した場合は、 それまでに baseClass を拡張して作成したすべてのクラスが削除されます。 &reftitle.returnvalues; &return.true.always; &reftitle.changelog; &Version; &Description; 8.4.0 DOMDocument::registerNodeClass の 仮の戻り値の型が、true になりました。 &reftitle.examples; 新しいメソッドを DOMElement に追加し、コードを書きやすくする 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(); ?> ]]> &example.outputs; ]]> カスタムクラス形式での要素の取得 nodeValue; } } $doc = new DOMDocument; $doc->loadXML("text in child"); $doc->registerNodeClass("DOMElement", "myElement"); $element = $doc->getElementsByTagName("child")->item(0); var_dump(get_class($element)); // __toString メソッドの助けを借ります.. echo $element; ?> ]]> &example.outputs; オーナードキュメントの取得 自作の DOMDocument インスタンスを作成すると、 ownerDocument プロパティが作成元のクラスを指すようになります。 しかし、そのクラスへの参照が全て削除されると、 そのクラスは削除され、新しい DOMDocument が代わりに作成されます。よって、 DOMDocument::registerNodeClass を、 DOMDocument と一緒に使うことができます。 loadXML("text in child"); $child = $doc->getElementsByTagName("child")->item(0); // このノードの現在のオーナーは myDOMDocument です var_dump(get_class($child->ownerDocument)); // MyDOMDocument を破棄します unset($doc); // そして新しい DOMDocument が作成されます var_dump(get_class($child->ownerDocument)); // MyDOMDocument からノードを import します $newdoc = new MyOtherDOMDocument; $child = $newdoc->importNode($child); // カスタムの DOMDocument を登録します $newdoc->registerNodeClass("DOMDocument", "MyOtherDOMDocument"); var_dump(get_class($child->ownerDocument)); unset($doc); // 新しい MyOtherDOMDocument を作成します var_dump(get_class($child->ownerDocument)); ?> ]]> &example.outputs; カスタムオブジェクトは一時的なもの 登録されたノードクラスは、一時的なものです。 つまり、PHPコードから参照されなくなった時には破棄され、 再度取得される際に再生成されます。 これは、カスタムプロパティの値は再生成された時に失われるということです。 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;