Завязываю, чтобы понять, как работает 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?
@ArtisticPhoenix, я думал, что SimpleXMLElement
использует libxml
под капотом для разбора xml. Итак, libxml
может не знать о SimpleXMLElement
, но обратное неверно. Определенно верно, что ошибки, выдаваемые SimpleXMLElement
, сохраняются в libxml
. И когда libxml_use_internal_errors( false );
, то предупреждения игнорируются, но если libxml_use_internal_errors( true );
предупреждения не игнорируются. Это может быть особенность, но она плохо документирована. :)
Тот же флаг был проигнорирован классом DomDocument и был ошибкой: git.php.net/… Возможно, это также считается ошибкой. Я знаю, что это старое, может, сейчас починили?
Интересно, что я не получаю предупреждения, когда запускаю ваш второй пример с использованием php 7.3.15, но он фиксируется в lib_xml_get_errors ().
Начиная с php 7.3.15, похоже, он работает правильно. Оба примера не отображают предупреждения, но второй пример фиксирует предупреждение. Флаг не предотвращает перехват предупреждений с помощью функции, он только подавляет отображение предупреждений на консоли или в веб-браузере.
У меня нет возможности проверить это сейчас, когда я больше не использую php. Спасибо за Ваш ответ. Надеюсь, это поможет кому-то другому.
Я сомневаюсь, что
libxml_use_internal_errors()
знает что-нибудь о классеSimpleXMLElement
, каждый из них занимается своим делом, это особенность, а не ошибка ... :-D