PHP выдает ошибку ... иногда на элемент DOM - PullRequest
1 голос
/ 20 августа 2010

Где-то в моем коде у меня есть:

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

Код сложный;Здесь я пытаюсь дать только суть.

Странно то, что это работает примерно четверть времени.3 раза из 4 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
(
)

Это верно даже при сбое страницы.

Я, должно быть, упускаю что-то очень очевидное.$thing_else - это узел того же документа DOM.

РЕШЕНИЕ: Это было действительно очень просто: по причинам, которые я до сих пор не совсем понимаю, эта часть кода вызывается дважды.В одном случае экземпляр не определен, но этот экземпляр появляется на втором месте в журналах, и я действительно искал только один.Если бы позаботился об этом.Теперь я должен понять, почему # @! ~ Их два.

Ответы [ 4 ]

2 голосов
/ 20 августа 2010

Хорошо, давайте посмотрим на это логически. Это говорит о том, что call to a member function replaceChild() on a non-object. Это означает, что вы пытаетесь вызвать 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 голос
/ 20 августа 2010
print_r($instance->about['an_element']);

вообще бесполезен, потому что ошибка при вызове replaceChild. Если бы $ instance-> about ['an_element'] был нулевым, вы бы получили сообщение об ошибке при обращении к свойству (parentNode) для не-объекта, которого у вас нет. Проверьте, что

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

не равно нулю. Я не могу сказать больше, не увидев полный код.

0 голосов
/ 20 августа 2010

insertBefore() текущий узел, затем используйте removeChild() на текущем узле.иногда вы можете заменить дочерний узел родительского узла, который не существует.

0 голосов
/ 20 августа 2010

Добро пожаловать в отладку.

do print_r($instance->about['an_element']) и добавьте этот вывод в ваш ответ.

Я подозреваю, что для $instance->about['an_element'].

не найдено ни одного родителя.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...