我的代码中的某处:
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文档的节点。
解决方案:确实非常简单:由于我仍然不太明白的原因,代码的这一部分被调用了两次。在一种情况下,实例未定义,但该实例在日志中显示在第二位,我真的只是寻找一个。如果照顾它。现在我必须先看看为什么#@!〜首先有两个。
答案 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()
。您可能偶尔会替换不存在的父节点的子节点。