Как продлить PHP DOMElement?

a.php

#!/usr/bin/php <?php class HtmlTable extends DOMElement { public function __construct($height, $width) { parent::__construct("table"); for ($i = 0; $i < $height; ++$i) { $row = $this->appendChild(new DOMElement("tr")); for($j = 0; $j < $width; ++$j) { $row->appendChild(new DOMElement("td")); } } } } $document = new DOMDocument("1.0", "UTF-8"); $document->registerNodeClass("DOMElement", "HtmlTable"); $document->appendChild(new HtmlTable(3, 2)); $document->saveXML(); 

Запуск этого

 Fatal error: Uncaught exception 'DOMException' with message 'No Modification Allowed Error' in /home/www/a.php:9 Stack trace: #0 /home/www/a.php(9): DOMNode->appendChild(Object(DOMElement)) #1 /home/www/a.php(19): HtmlTable->__construct(3, 2) #2 {main} thrown in /home/www/a.php on line 9 

Related of "Как продлить PHP DOMElement?"

копирование и вставка из комментария php.net

После поиска, как расширить DOMDocument и DOMElement, я нашел способ в ошибке: http://bugs.php.net/bug.php?id=35104 . Следующий код показывает, как:

 <?php class extDOMDocument extends DOMDocument { public function createElement($name, $value=null) { $orphan = new extDOMElement($name, $value); // new sub-class object $docFragment = $this->createDocumentFragment(); // lightweight container maintains "ownerDocument" $docFragment->appendChild($orphan); // attach $ret = $docFragment->removeChild($orphan); // remove return $ret; // ownerDocument set; won't be destroyed on method exit } // .. more class definition } class extDOMElement extends DOMElement { function __construct($name, $value='', $namespaceURI=null) { parent::__construct($name, $value, $namespaceURI); } // ... more class definition here } $doc = new extDOMDocument('test'); $el = $doc->createElement('tagname'); $el->setAttribute("attr", "val"); $doc->appendChild($el); // append discards the DOMDocumentFragment and just adds its child nodes, but ownerDocument is maintained. echo get_class($el)."<br/>"; echo get_class($doc->documentElement)."<br/>"; echo "<xmp>".$doc->saveXML()."</xmp>"; ?>