【问题标题】:How to make PHP undefined constants notice an error如何让 PHP 未定义的常量注意到错误
【发布时间】:2011-07-05 23:34:46
【问题描述】:

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

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

哪些 PHP 好心地融入:

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

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

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

【问题讨论】:

  • 现代 IDE 应该会告诉你这样的错误
  • Matthew php 已经将该错误显示为通知:d
  • @KingCrunch 确实如此,但是当我错过某些东西时发生错误有助于实际调试它。如果我在 IDE 中遗漏了某些内容,然后尝试运行该页面并显示“哦,您在此行的此文件中做了一些愚蠢的事情”并且不尝试运行它,那么我将转到该行并归档并那我看看问题。
  • @KingCrunch 如果我正在查看其他人所做的事情并试图找出问题所在,它也对我没有任何帮助。
  • @yes123:它还显示了许多其他“错误”作为通知。这真的不应该是一个通知,它充其量只是一个警告,但至少在我看来真的应该是一个错误。

标签: php constants


【解决方案1】:

您可以创建一个自定义错误函数,然后过滤掉最常见的错误,只报告不太常见的错误。然后在 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 的路径并测试是否 它在您的模块/视图/控制器中 文件,而不是核心框架 文件

【讨论】:

  • 添加了更多过滤选项。当您在框架中工作时,最后一个可能是最好的
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2012-02-22
    • 2016-10-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-06
    • 2011-02-25
    • 2011-05-26
    • 1970-01-01
    相关资源
    最近更新 更多