2010-04-20 51 views
2

a.php只会如何扩展PHP DOMElement?

#!/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 

回答

3

php.net comment

复制和粘贴搜索如何扩展 DOM文档和一个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>"; 
?>