这是一个测试用例,突出了我遇到的错误。我认为节点被破坏/垃圾收集/函数返回后的东西 - 有更好的方法可以解决这个问题吗?
function render($doc) {
$fragment = $doc -> createDocumentFragment();
$fragment -> appendXML('<iframe foo="bar"/>');
return $fragment -> childNodes -> item(0);
}
$doc = new \DOMDocument();
$element = render($doc);
// Exception: Couldn't fetch DOMElement. Node no longer exists
echo $element -> tagName; // fails -- because element no longer exists
答案 0 :(得分:1)
由于您只创建了一个元素,因此无需创建片段。只需创建元素并设置其属性。
function render($doc) {
$element = $doc -> createElement('iframe');
$element -> setAttribute('foo', 'bar');
return element;
}
$doc = new DOMDocument();
$element = render($doc);
echo $element -> tagName;
答案 1 :(得分:1)
我找到了一种解决方法:只需调用cloneNode()并返回克隆:
return $element->cloneNode();
我同意这是奇怪的行为......我不明白为什么PHP会这样做,但至少有一种解决方法仍然允许你使用文档片段。对于更复杂的片段,您可能需要将true
传递给cloneNode以告诉它进行深层复制,我不确定。