Php 为什么E_警告像E_错误一样?

Php 为什么E_警告像E_错误一样?,php,error-handling,phpseclib,Php,Error Handling,Phpseclib,我正在运行一个脚本,该脚本需要一个未正确包含在脚本中的文件 PHP致命错误:require_once():在第746行/myDir/Net/SSH2.PHP中打开所需的'Math/biginger.PHP'(include_path='。:/usr/share/PHP:/usr/share/pear')失败 我有一个error\u处理程序设置,它记录我得到的每个错误: function script_error_handler($errno, $errstr, $errfile, $errlin

我正在运行一个脚本,该脚本需要一个未正确包含在脚本中的文件

PHP致命错误:require_once():在第746行/myDir/Net/SSH2.PHP中打开所需的'Math/biginger.PHP'(include_path='。:/usr/share/PHP:/usr/share/pear')失败

我有一个
error\u处理程序
设置,它记录我得到的每个错误:

function script_error_handler($errno, $errstr, $errfile, $errline){
    echo "IN ERROR HANDLER\n";

    $GLOBALS['errors'][] = array(
        'errno'     => $errno,
        'errstr'    => $errstr,
        'errfile'   => $errfile,
        'errline'   => $errline
    );

    return true;
}
我还有一个
shutdown\u函数
,它稍后会检查错误以确定成功或失败(除其他外)。该函数的一部分用于打印我记录的错误

function shutdown_handler($io) {
    print_r($GLOBALS['errors']);
    echo "\n";
    //irrelevant stuff ommitted
}
奇怪的是,其结果如下:

Array
(
    [0] => Array
        (
            [errno] => 2
            [errstr] => require_once(Math/BigInteger.php): failed to open stream: No such file or directory
            [errfile] => /myDir/Net/SSH2.php
            [errline] => 746
        )

)
根据PHP的说法,
2
E_警告的值

2 | E|u警告(整数)|运行时警告(非致命错误)。脚本的执行未停止。


这似乎与我之前得到的
致命错误
输出有明显冲突。在这种情况下,我为什么不得到一个
E\u错误
?这里发生了什么?

require
/
require\u一次
生成警告和致命错误

如果没有自己的错误处理,您应该得到如下结果:

警告:require_once(foo)[function.require once]:无法打开流:在[…]中没有这样的文件或目录

致命错误:require_once()[function.require]:打开所需的“foo”(include_path=')失败[…]

查看输出的
errstr
,您会看到“未能打开流:没有这样的文件或目录”部分–因此警告的文本

这个故事告诉你

无法使用用户定义的函数处理以下错误类型:E_error,[…]


因此,正如预期的那样捕获了警告,而根据手册所述,致命错误没有捕获。

你能说明你是如何注册处理程序的吗?我可以,但我看不出这有什么关系。当我从这两个处理程序中得到输出时,它们显然正在被注册和调用。但是,如果你发布一个完整的测试用例,然后在提出问题时回答他们的问题,那么人们会更容易地帮助你。因此,我应该能够检查
错误\u get_last()
,如果是E_错误,则将其添加到我的
shutdown_function()
中的错误列表中。这是一个公平的假设吗?