Это не пользовательский обработчик ошибок, который вызывает ошибку.
Я запустил следующий код без специального обработчика ошибок:
$output = file_get_contents("http://www.ssense.com/women/designers/all/all/page_1");
$dom = new DOMDocument();
$dom->loadHTML($output);
$xpath = new DOMXPath($dom);
Когда я его запустил, я получил тоннупредупреждающих сообщений, похожих на те, что есть в вашем обработчике ошибок.
Я думаю, что проблема, которую вы видите, заключается в том, что ваш обработчик ошибок сообщает об ошибках, которые PHP не сообщает по умолчанию.
По умолчанию уровень отчетов об ошибках определяется вашими настройками php.ini
, но может быть изменен с помощью функции error_reporting()
.Когда вы устанавливаете свой собственный обработчик ошибок, вы должны сами определить, с каким уровнем отчетности вы хотите иметь дело.Ваш обработчик ошибок будет вызываться при каждой ошибке и уведомлении, и поэтому вы будете выводить сообщения об ошибках для всего , если только вы явно не сверяете генерируемую ошибку с текущим уровнем error_reporting()
.
Помните, что использование оператора подавления ошибок @
является просто сокращением для установки error_reporting(0)
для этой строки.Например, эта строка:
@$dom->loadHTML($output);
- это просто сокращение для следующего:
$errorLevel = error_reporting(0);
$dom->loadHTML($output);
error_reporting($errorLevel);
Поскольку обычное сообщение об ошибках PHP полностью игнорируется при использовании пользовательского обработчика, при использовании @
Оператор не имеет смысла, так как текущий уровень error_reporting()
полностью игнорируется.Вам нужно было бы написать собственный код в свой обработчик ошибок, чтобы проверить текущий уровень error_reporting()
и обработать его соответствующим образом, например:
function my_error_handler() {
if (error_reporting() == 0) {
return; // do nothing when error_reporting is disabled.
}
// normal error handling here
}
Я предполагаю, что, когда не используется специальный обработчик ошибок, PHPпросто по умолчанию установлен на уровень error_reporting()
, который ниже производимых ошибок.
Если вы добавите error_reporting(E_ALL | E_STRICT);
в начало вашего кода, вы увидите те же ошибки, даже если у вас нетВаш пользовательский обработчик ошибок включен.