如何扩展PHP DOMElement? [英] How can I extend PHP DOMElement?

查看:114
本文介绍了如何扩展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


推荐答案

php.net注释


在搜索了如何扩展
DOMDocument和DOMElement之后,我发现了一个$ b $错误中的b种方式:
http://bugs.php.net/ bug.php?id = 35104
以下代码显示了如何:

After searching how to extend the DOMDocument and DOMElement I found a way in the bug: http://bugs.php.net/bug.php?id=35104. The following code shows how:



<?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>";
?>

这篇关于如何扩展PHP DOMElement?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆