0

这是一个突出显示我遇到的错误的测试用例。我认为在函数返回后节点正在被销毁/垃圾收集/某些东西 - 有没有更好的方法可以解决这个问题?

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
4

2 回答 2

1

由于您只创建一个元素,因此无需制作片段。只需创建元素并设置其属性。

function render($doc) {

    $element = $doc -> createElement('iframe');
    $element -> setAttribute('foo', 'bar');
    return element;
}

$doc = new DOMDocument();
$element = render($doc);

echo $element -> tagName;
于 2013-01-20T00:12:49.657 回答
1

我找到了一种解决方法:只需调用 cloneNode() 并返回克隆:

return $element->cloneNode();

我同意这是一种奇怪的行为......我不明白 PHP 为什么会这样做,但至少有一种解决方法仍然允许您使用文档片段。对于更复杂的片段,您可能需要传递true给 cloneNode 以告诉它进行深层复制,我不确定。

于 2013-02-02T16:09:13.813 回答