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

Mat*_*ley 7 php constants

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

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

哪个PHP好好进入:

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

这会导致无限循环,最终由于附加到阵列而导致内存不足错误.PHP将生成通知级别错误,我可以更改我的错误报告级别以显示这些但我正在处理第三方应用程序,这种应用程序倾向于生成足够的这些,这不是真正可行的解决方案.

有没有办法捕获这些非常简单的错误?具有讽刺意味的是,如果你做了类似的事情constant('i')并明确要求它,它会产生警告而不是通知,这种行为将是理想的.

Tak*_*Tak 4

您可以创建自定义错误函数,然后过滤掉最常见的错误并仅报告不太常见的错误。然后提高 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");
Run Code Online (Sandbox Code Playgroud)

您还可以像这样过滤错误:

  • $error_file通过针对您维护的文件数组进行测试来过滤掉所有错误,除非它们位于感兴趣的文件中

  • 更好的是(不在生产​​服务器上)获取$error_filewith 的 last_modified 日期/时间filemtime(),如果在过去 10 分钟内发生更改,则报告错误。这可以帮助您在编写代码时调试代码

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