error_level 和 error_message 从哪里以及如何进入自定义错误处理函数?

From where and how do the error_level and error_message come in custom error handler function?

我正在学习 PHP 来自 w3school 的 PHP 教程

在一章 "PHP Error Handling" 中,我正在研究 创建自定义错误处理程序

我遇到了以下程序,其中定义了 自定义错误处理函数 。请看下面的代码。

<?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_NOTICE、E_WARNING、E_ERROR、 ETC)。此参数在源代码中设置。对于您的示例,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); 

您的自定义处理程序收到的错误级别是 PHP 的 E_* 常量之一。您会找到可能的常量列表及其值 here.

在您的示例中,使用未定义的变量 $test 通常会导致 PHP 通知。因此,您在自定义处理程序中将值 8(即 E_NOTICE)作为 $errno。您无法更改错误消息,因为此错误是由 PHP.

内部生成的

尝试一下:删除自定义错误处理程序并查看 PHP 为您提供的使用未定义变量的错误。这正是您的自定义处理程序被调用的级别和消息。

我建议您使用 trigger_error() 函数 (see here) 试用您的处理程序。这是设置错误级别和自己发送消息的唯一方法。

另请注意,error_reporting ini 设置中的设置无关紧要!无论级别如何,您的自定义处理程序总是会收到所有错误消息。

请通读上面链接的手册页。