PHP有时会在DOM元素上抛出错误

时间:2010-08-20 12:13:03

标签: 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']);

代码很复杂;我试图在这里给出要点。

奇怪的是,它的工作时间约为四分之一。 4次中有3次,PHP表示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文档的节点。

解决方案:确实非常简单:由于我仍然不太明白的原因,代码的这一部分被调用了两次。在一种情况下,实例未定义,但该实例在日志中显示在第二位,我真的只是寻找一个。如果照顾它。现在我必须先看看为什么#@!〜首先有两个。

4 个答案:

答案 0 :(得分:2)

好吧,让我们从逻辑上看一下。它说是call to a member function replaceChild() on a non-object。这意味着你试图在未设置或不是对象(duh)的东西上调用replaceChild。让我们来看看有替换孩子的电话。

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

这意味着$instance->about['an_element']必须没有父节点(否则它将是一个对象)。这意味着它是根节点或孤立节点(仍然绑定到dom但已从树中删除的节点。因此它没有父节点)。您可以添加逻辑以防止an_element成为非父级,也可以在替换之前检查以确保它具有父级:

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

答案 1 :(得分:1)

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

根本没用,因为错误是在调用replaceChild时。如果$ instance-> about ['an_element']为null,则会得到您正在访问非对象上的属性(parentNode)的错误。 检查

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

不为空。如果没有看到完整的代码,我就不能多说了。

答案 2 :(得分:0)

欢迎使用调试。

执行print_r($instance->about['an_element'])并将该输出添加到您的答案中。

我怀疑没有为$instance->about['an_element']找到父母。

答案 3 :(得分:0)

insertBefore()当前节点然后在当前节点上使用removeChild()。您可能偶尔会替换不存在的父节点的子节点。