为啥调用未定义函数时没有 PHP 错误?

Posted

技术标签:

【中文标题】为啥调用未定义函数时没有 PHP 错误?【英文标题】:Why no PHP error on call to undefined function?为什么调用未定义函数时没有 PHP 错误? 【发布时间】:2011-12-15 09:20:37 【问题描述】:

每当调用未定义的函数时,都不会记录任何错误。相反,脚本只是停止执行。更糟糕的是,如果我运行 php -l filename.php,它表明没有语法错误。我正在使用自定义错误处理函数,但即使是第一行也从未到达。

当调用未定义的函数时,如何让它运行我的错误处理程序?

我使用的是 PHP 5.3.2-1。这是设置错误处理程序的代码:

error_reporting(-1);
$old_error_handler = set_error_handler( "userErrorHandler" );
set_exception_handler('exception_handler');

错误处理程序和异常处理程序均未到达,尽管它们确实适用于其他错误。

我想要这个的原因是我最终不得不在我的代码中放置调试语句,以查看它在停止执行之前能走多远,与告诉我文件和行号的错误消息相比,这是一个缓慢的过程错误是。

【问题讨论】:

【参考方案1】:

manual 中有一个相关的部分用于set_error_handler()

以下错误类型无法使用用户定义的函数处理:E_ERRORE_PARSEE_CORE_ERRORE_CORE_WARNINGE_COMPILE_ERRORE_COMPILE_WARNING 以及文件中引发的大部分 E_STRICT其中set_error_handler() 被调用。

【讨论】:

【参考方案2】:

用户错误处理程序无法捕获致命错误。

见http://php.net/manual/en/function.set-error-handler.php

具体部分:

以下错误类型无法用用户定义的方式处理 功能:E_ERROR、E_PARSE、E_CORE_ERROR、E_CORE_WARNING、 E_COMPILE_ERROR、E_COMPILE_WARNING 和大部分 E_STRICT 在 调用 set_error_handler() 的文件。

根据 PHP 手册页上的 cmets,一种解决方法是测试关闭函数中的错误:

<?php
    error_reporting(E_ALL);
    ini_set('display_errors', 0);

    function shutdown()
        $isError = false;
        if ($error = error_get_last())
            switch($error['type'])
                case E_ERROR:
                case E_CORE_ERROR:
                case E_COMPILE_ERROR:
                case E_USER_ERROR:
                    $isError = true;
                    break;
            
        

        if ($isError)
            echo "Script execution halted ($error['message'])";
         else 
            echo "Script completed";
        
    

    register_shutdown_function('shutdown');
?>

【讨论】:

+1 表示完整性(“为什么 id 不起作用”和解决方法) 此解决方法效果很好!我还根据您链接到的文档在 switch 语句中添加了以下情况:E_PARSE、E_COMPILE_WARNING、E_STRICT。根据文档,以这种方式捕获 E_STRICT 错误似乎有时会导致重复记录错误,但有必要记录所有错误。我基于文档说“大多数” E_STRICT 错误无法使用用户定义的函数来处理。 此外,文档中不包含用户定义函数无法处理的错误类型列表中的 E_USER_ERROR,因此我从您发布的代码中删除了该案例。 作为此解决方法的一部分,我还想从关闭函数内部调用我的自定义错误处理程序,以处理它尚未捕获的错误类型。

以上是关于为啥调用未定义函数时没有 PHP 错误?的主要内容,如果未能解决你的问题,请参考以下文章

为啥在使用 AJAX/PHP 时收到未定义索引错误?

phpMyAdmin 错误调用未定义函数

OpenWRT PHP 致命错误:调用未定义函数 json_encode()

致命错误:调用未定义函数session_register()[重复]

收到“未定义无参数构造函数”错误,不知道为啥

致命错误:调用未定义函数 oci_connect()