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

作成する要素は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 に答える