2010-08-20 64 views
1

某處在我的代碼有:PHP拋出一個錯誤......有時,在一個DOM元素

class aclass { 
    ... 
    function amethod() { 
    $this->dom = $a_dom_document; 
    $this->about = array('an_element' => $an_element_of_that_document); 
    } 
    ... 
} 

/* Somewhere else */ 

$instance->dom; // It's there, no problem. 
$instance->about['an_element']->parentNode->replaceChild($something_else, $this->about['an_element']); 

的代碼是複雜的;我試圖在這裏給出要點。

奇怪的是,它的作用大約四分之一的時間。 PHP中有3次表示,replaceChild是「在非對象上調用成員函數replaceChild()」,但四分之一的時間內,它實際上工作。可能會發生什麼?

編輯:下面

print_r($instance->about['an_element']); 
print_r($instance->about['an_element']->parentNode); 
print method_exists($instance->about['an_element'], 'replaceChild')?'exists':'does not exist'); 
print_r($something_else);  

回報:

DOMElement Object 
(
) 
DOMElement Object 
(
) 
exists 
DOMElement Object 
(
) 

這是真實的,即使當頁面失敗。

我必須錯過一些非常明顯的東西。 $ something_else是同一個DOM文檔的一個節點。

解答:確實很簡單:由於我仍然不太明白的原因,代碼的這部分被調用兩次。在一種情況下,實例未定義,但該實例在日誌中排在第二位,我真的只是在尋找一個實例。一個如果照顧它。現在我必須明白爲什麼#@!〜首先有兩個。

+2

通常這意味着您的DOM遍歷不起作用。在上面的例子中,這意味着沒有父節點可以找到'an_element' – thetaiko 2010-08-20 12:21:29

回答

1
print_r($instance->about['an_element']); 

根本沒用,因爲錯誤在調用replaceChild。如果$ instance-> about ['an_element']爲空,那麼您將得到一個錯誤,即您正在訪問一個非對象上的屬性(parentNode),而您並不知道該對象。 檢查

print_r($instance->about['an_element']->parentNode); 

不爲空。沒有看到完整的代碼,我不能說更多。

0

歡迎來到調試。

print_r($instance->about['an_element'])並將該輸出添加到您的答案。

我想懷疑$instance->about['an_element']找不到父母。

+0

我不能在這裏格式化代碼;我會把它作爲對問題的編輯。 – eje211 2010-08-20 13:24:13

2

那麼,讓我們看看這個邏輯。這是說call to a member function replaceChild() on a non-object。這意味着你試圖在沒有設置或者不是對象(duh)的東西上調用replaceChild。讓我們來看看哪裏有電話來替換孩子。

$instance->about['an_element']->parentNode->replaceChild(...) 

因此,這意味着該$instance->about['an_element']必須沒有父節點(否則這將是一個對象)。所以這意味着它可能是根節點或孤兒節點(仍然綁定到DOM的節點,但已經從樹中刪除,因此它沒有父節點)。您可以添加邏輯,以防止從以往任何時候都無父,或者你可以檢查更換之前,爲了確保它有一個父:

if (is_object($instance->about['an_element']->parentNode)) { 
    $instance->about['an_element']->parentNode->replaceChild(...); 
} else { 
    // You have a non-parented node, do something else 
} 
0

insertBefore()當前節點,那麼當前節點上使用removeChild()。您可能偶爾會替換不存在的父級的子節點。

+2

這意味着在遍歷期間DOM樹結構可能已經改變,即父母也可能經歷了改變結構的replaceChild(),因此當前節點可能不再是所謂的父母的孩子。 – stillstanding 2010-08-20 12:32:11