Я учу PHP из Учебник PHP по w3school.
В главе «Обработка ошибок PHP», Я учусь о Создание собственного обработчика ошибок.
Я наткнулся на следующую программу, в которой Пользовательская функция обработчика ошибок определено. Посмотрите код ниже.
<?php
//error handler function
function customError($errno, $errstr) {
echo "<b>Error:</b> [$errno] $errstr";
}
//set error handler
set_error_handler("customError");
//trigger error
echo($test);
?>
Вывод приведенного выше кода выглядит следующим образом:
Ошибка: [8] Неопределенная переменная: тест
Мое сомнение в том, что я нигде не указал уровень ошибки и сообщение об ошибке в программе, откуда и как пользовательская функция ошибок получает уровень ошибки и сообщение об ошибке?
Как весь этот специальный механизм обработки ошибок работает в PHP?
Пожалуйста, объясните мне простым и ясным языком. Вы можете объяснить с помощью другого примера тоже. На самом деле, мне было бы лучше понять это.
Уровень ошибок, который получает ваш пользовательский обработчик, является одной из констант PHP E_ *. Вы найдете список возможных констант и их значений Вот.
В вашем примере использование неопределенной переменной $test
обычно вызывает уведомление PHP. Следовательно, вы получаете значение 8 (которое E_NOTICE
) как $errno
в вашем собственном обработчике. Вы не можете изменить сообщение об ошибке, так как эта ошибка генерируется внутри PHP.
Попробуйте: удалите пользовательский обработчик ошибок и посмотрите на ошибку, которую дает PHP за использование неопределенной переменной. Это именно тот уровень и сообщение, с которыми вызывается ваш пользовательский обработчик.
Я предлагаю вам попробовать свой обработчик, используя trigger_error()
функция (посмотреть здесь). Это единственный способ установить уровень ошибки и сообщать о себе.
Также обратите внимание, что не имеет значения, что установлено в параметре ini error_reporting! Ваш пользовательский обработчик всегда получает ВСЕ сообщения об ошибках независимо от уровня.
Пожалуйста, прочитайте справочные страницы, ссылки на которые приведены выше.
Все ошибки, вызванные самим PHP или его расширениями, имеют определенное сообщение и тип (уровень серьезности, такой как E_NOTICE, E_WARNING, E_ERROR и т. Д.). Эти параметры устанавливаются в исходном коде. Для вашего примера zend_execute.c:
static zend_never_inline ZEND_COLD void zval_undefined_cv(uint32_t var, const zend_execute_data *execute_data)
{
zend_string *cv = CV_DEF_OF(EX_VAR_TO_NUM(var));
zend_error(E_NOTICE, "Undefined variable: %s", ZSTR_VAL(cv));
}
Вы можете создать ошибку на уровне пользователя через trigger_error()
функция. Это позволяет указать пользовательское сообщение и один из E_USER_*
типы для испущенной ошибки.
trigger_error("Some message", E_USER_ERROR);