Я анализирую XML-файл в PHP как DOMDocument. Это часть относительно стабильного кода, который я написал недавно для анализа нашего XML, и до недавнего времени он работал нормально. Посреди множества похожих утверждений у меня есть следующая строка кода:
$appDomain = $domDoc->getElementsByTagName("appDomain")->item(0)->textContent;
Этот метод выдает ошибку «Попытка получить свойство не-объекта», но код все равно проходит и работает нормально.
Что сводит меня с ума, так это следующее. Используя копирование / вставку, я добавил следующую строку.
echo "". $domDoc->getElementsByTagName("appDomain")->item(0)->textContent;
$appDomain = $domDoc->getElementsByTagName("appDomain")->item(0)->textContent;
Так что теперь я запускаю один и тот же код дважды, один раз повторяя его и один раз сохраняя. Эхо правильно печатает значение тега (то есть Extract) из моего XML, но я все еще получаю сообщение об ошибке, и строка ошибки — это присвоение строке $ appDomain, не линия эха.
Кроме того, если я добавлю
echo $appDomain;
сразу после этого вызова он печатает правильное значение «Извлечь», как будто ошибки не произошло. Если я закомментирую присвоение $ appDomain, я соответствующим образом получаю ошибку «Undefined variable» в строке echo $ appDomain (я просто сделал это, чтобы проверить, что $ appDomain не установлен где-то еще). Если я затем добавлю жестко закодированный $ appDomain, вот так:
echo "". $domDoc->getElementsByTagName("appDomain")->item(0)->textContent;
//$appDomain = $domDoc->getElementsByTagName("appDomain")->item(0)->textContent;
$appDomain = "Extract";
echo $appDomain;
Теперь код печатает «ExtractExtract» соответствующим образом, но я получаю попытку получить ошибку свойства в ПЕРВОЙ строке эха.
ЧТО ЖЕ ТАКОЕ ПРОИСХОДИТ? Тег находится в XML (уже некоторое время, и этот код работает нормально). Код правильно получает элемент, получает его текстовое содержимое и правильно помещает его в переменную $ appDomain. Но все равно выдает ошибку.
Кроме того, следующие var_dumps, похоже, ведут себя именно так, как и должны:
var_dump($domDoc->getElementsByTagName("appDomain"));
echo "<br><br>";
var_dump($domDoc->getElementsByTagName("appDomain")->item(0));
echo "<br><br>";
var_dump($domDoc->getElementsByTagName("appDomain")->item(0)->textContent);
Я получаю следующее:
object(DOMNodeList)#3 (1) { ["length"]=> int(1) }
object(DOMElement)#2 (18) { ["tagName"]=> string(9) "appDomain" ["schemaTypeInfo"]=> NULL ["nodeName"]=> string(9) "appDomain" ["nodeValue"]=> string(7) "Extract" ["nodeType"]=> int(1) ["parentNode"]=> string(22) "(object value omitted)" ["childNodes"]=> string(22) "(object value omitted)" ["firstChild"]=> string(22) "(object value omitted)" ["lastChild"]=> string(22) "(object value omitted)" ["previousSibling"]=> string(22) "(object value omitted)" ["nextSibling"]=> string(22) "(object value omitted)" ["attributes"]=> string(22) "(object value omitted)" ["ownerDocument"]=> string(22) "(object value omitted)" ["namespaceURI"]=> NULL ["prefix"]=> string(0) "" ["localName"]=> string(9) "appDomain" ["baseURI"]=> string(62) "/Applications/MAMP/htdocs/Tmp/bowersjc/Experiment33/config.xml" ["textContent"]=> string(7) "Extract" }
string(7) "Extract" Extract
Но я получаю сообщение об ошибке в последнем var_dump (и если я закомментирую его, я не получу ошибок).
Опять же, ЧТО ПРОИСХОДИТ?
Я столкнулся с той же ошибкой в методе рекурсивного класса, где объект определенно был объектом, но ошибка (предупреждение) продолжала происходить.
Сначала вы можете проверить, что это действительно объект с is_object($el)
Иногда рекурсия (парсеры xml являются рекурсивными) и передача аргументов в методы объекта могут вызвать проблемы. Это может быть связано с аргументом ->item(0)
, Пытаться ->item()[0]
для элемента 0 вместо аргумента 0.
Других решений пока нет …