为啥调用未定义函数时没有 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_ERROR
、E_PARSE
、E_CORE_ERROR
、E_CORE_WARNING
、E_COMPILE_ERROR
、E_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 错误?的主要内容,如果未能解决你的问题,请参考以下文章
OpenWRT PHP 致命错误:调用未定义函数 json_encode()