Почему libxml_use_internal_errors (true) не уважает LIBXML_NOWARNING?

Завязываю, чтобы понять, как работает libxml_use_internal_errors(true). Кажется, он не уважает флаг LIBXML_NOWARNING.

Вот пример использования PHP 7.2.4.

libxml_use_internal_errors( false );
new SimpleXMLElement(
  '<DataSet xmlns = "iminvalid"></DataSet>', 
  LIBXML_NOWARNING );
var_dump(sizeof(libxml_get_errors()));
// int(0)

Как и ожидалось, эти заявления не содержат никаких предупреждений. Предупреждение о пространстве имен скрыто из-за LIBXML_NOWARNING.

Однако это:

libxml_use_internal_errors( true );
new SimpleXMLElement(
  '<?xml version = "1.0" encoding = "utf-8"?><DataSet xmlns = "iminvalid"></DataSet>', 
  LIBXML_NOWARNING );
var_dump(sizeof(libxml_get_errors()));

// int(1)
// xmlns: URI iminvalid is not absolute

Неожиданно возвращает предупреждение о недопустимом URI. Как можно libxml_use_internal_errors( true ) и скрыть предупреждения синтаксического анализа XML?

Я сомневаюсь, что libxml_use_internal_errors() знает что-нибудь о классе SimpleXMLElement, каждый из них занимается своим делом, это особенность, а не ошибка ... :-D

ArtisticPhoenix 26.10.2018 00:26

@ArtisticPhoenix, я думал, что SimpleXMLElement использует libxml под капотом для разбора xml. Итак, libxml может не знать о SimpleXMLElement, но обратное неверно. Определенно верно, что ошибки, выдаваемые SimpleXMLElement, сохраняются в libxml. И когда libxml_use_internal_errors( false );, то предупреждения игнорируются, но если libxml_use_internal_errors( true ); предупреждения не игнорируются. Это может быть особенность, но она плохо документирована. :)

Andrew Eisenberg 26.10.2018 04:37

Тот же флаг был проигнорирован классом DomDocument и был ошибкой: git.php.net/… Возможно, это также считается ошибкой. Я знаю, что это старое, может, сейчас починили?

ADJenks 08.04.2020 19:22

Интересно, что я не получаю предупреждения, когда запускаю ваш второй пример с использованием php 7.3.15, но он фиксируется в lib_xml_get_errors ().

ADJenks 08.04.2020 19:24
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
4
276
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Начиная с php 7.3.15, похоже, он работает правильно. Оба примера не отображают предупреждения, но второй пример фиксирует предупреждение. Флаг не предотвращает перехват предупреждений с помощью функции, он только подавляет отображение предупреждений на консоли или в веб-браузере.

У меня нет возможности проверить это сейчас, когда я больше не использую php. Спасибо за Ваш ответ. Надеюсь, это поможет кому-то другому.

Andrew Eisenberg 09.04.2020 00:15

Другие вопросы по теме