如何使PHP未定义常量注意到一个错误


How to make PHP undefined constants notice an error

我刚刚花了几个小时试图调试由以下代码引起的内存不足错误:

for ($i = 1; i <= 4; $i++) {
  $allowed[] = $type.'_'.$i;
}

PHP好心地把它变成:

for ($i = 1; 'i' <= 4; $i++) {
  $allowed[] = $type.'_'.$i;
}

这会导致一个无休止的循环,最终会由于追加到数组而导致内存不足错误。PHP会生成一个通知级别的错误,我可以更改错误报告级别来显示这些错误,但我正在开发一个第三方应用程序,该应用程序倾向于生成足够多的错误,因此这不是一个真正可行的解决方案。

有什么方法可以诱捕这些非常简单的错误吗?具有讽刺意味的是,如果您执行类似constant('i')的操作并明确要求值,它将生成警告而不是通知,这种行为将是理想的。

您可以创建一个自定义错误函数,然后过滤掉最常见的错误,只报告不太常见的错误。然后在PHP中提升错误报告级别。例如

function customError($error_no, $error_message, $error_file, $error_line, $error_context) {
    $common_errors = Array('File not found', 'Another made up error', 'Its late');
    if (! in_array($error_message, $common_errors)) {
        // throw exception, log to file, or other action
    }
}
set_error_handler("customError");

你也可以过滤这样的错误:

  • 过滤掉所有错误,除非它们是通过测试在感兴趣的文件中$error_file对抗您维护的文件

  • 甚至更好(不是在生产中服务器(获取last_modified$error_file的日期/时间filemtime()并报告错误,如果它在过去10年内发生了变化分钟这有助于将代码调试为你写

  • 或者如果它在一个框架内你的听起来像是,分开$error_file的路径,并测试它在您的模块/视图/控制器中文件,而不是核心框架文件

在PHP 7.2中,此通知已更改为警告。

在PHP 8.0中,这将是一个错误。