2013-01-20 6 views
0

다음은 내가 실행 한 오류를 강조하는 테스트 사례입니다. 노드가 파괴되고 있다고 생각합니다./함수가 반환 된 후에는 가비지 수집/무언가가 있습니다.이 문제를 해결할 수있는 더 좋은 방법이 있습니까?노드가 더 이상 존재하지 않기 때문에 DocumentFragment 내의 요소를 반환하지 않습니다.

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 

답변

1

하나의 요소 만 만들면 조각을 만들 필요가 없습니다. 요소를 만들고 속성을 설정하기 만하면됩니다.

function render($doc) { 

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

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

echo $element -> tagName; 
+0

이것은 단지 테스트 케이스 일 뿐이며 조각에 추가되는 모든 종류의 것들이있을 수 있습니다. "렌더링"이 반환 된 후에 요소를 테스트하고 거기에있는 내용을보고 싶습니다. – ansiart

+0

@ansiart 왜 조각 자체를 반환하지 않습니까? – Musa

+0

예, 그게 지금하고있는 일입니다. 노드 나 아무것도 제거하지 않고 있기 때문에 그것이 여전히 존재하는 요소를 gcing하고있는 것은 매우 이상합니다. – ansiart

1

내가 해결 방법을 찾을 : 단순히 cloneNode를 (전화)과 복제를 돌려 : PHP는이 작업을 수행하는 이유

return $element->cloneNode();

나는이 이상한 동작입니다 동의합니다 ... 이해가 안 돼요 하지만 적어도 문서 조각을 사용할 수있는 해결 방법이 있습니다. 좀 더 복잡한 조각을 원한다면, 복제본을 만들기 위해 cloneNode에 true을 전달해야 할 수도 있습니다. 확실하지 않습니다.