【问题标题】:E_NOTICE: Report only undefined variablesE_NOTICE:只报告未定义的变量
【发布时间】:2023-03-09 10:21:01
【问题描述】:

我希望在使用未定义变量时看到一个错误,但最好避免看到其他 E_NOTICE 错误,这可能吗?

【问题讨论】:

  • 可能使用custom error handler 过滤掉您不想要的消息。但是其他通知不是您想要修复或能够修复的吗?
  • 你不应该隐藏其他通知。
  • 事实上,当我启用 E_NOTICE 错误时,我的脚本需要数年才能运行,我等了 2 分钟然后停止了它(它通常持续 10 秒......)。我想这是因为有太多的 E_NOTICE 错误,而 php 永远不会结束,因为它加载了数千个错误。我的剧本很大。
  • @sylvain1264 如果是这种情况,那么您的代码肯定有其他问题需要修复。我建议您在缩小脚本中生成通知以帮助更正它的部分之后再写一个新问题。 There is advice here 关于如何纠正这些特定错误。
  • 好吧,我找到了为什么我有这么多 E_NOTICES,如果我运行我的整个脚本,我会收到数百万条通知消息,因为我的数组使用像 A 这样的键而不是 'A' 所以 php 告诉我我使用未定义的常量。

标签: php error-reporting e-notices


【解决方案1】:

我正式建议不要这样做,因为很可能编写不会生成警告或通知的 PHP 代码。事实上,这应该是您的目标 - 消除所有通知和警告。

但是,您的要求可以通过set_error_handler() 使用 PHP 的自定义错误处理来实现,它接受一个回调函数以在发出错误时运行。

您将在错误字符串$errstr 回调参数中定义函数来对undefined indexundefined variable 进行字符串匹配。然后,您实际上覆盖了 PHP 的正常错误报告系统,并替换为您自己的。我要重申,我认为这不是一个很好的解决方案。

$error_handler = function($errno, $errstr, $errfile, $errline) {
  if (in_array($errno, array(E_NOTICE, E_USER_NOTICE))) {
    // Match substrings "undefined index" or "undefined variable"
    // case-insensitively. This is *not* internationalized.
    if (stripos($errstr, 'undefined index') !== false || stripos($errstr, 'undefined variable') !== false) {
       // Your targeted error - print it how you prefer
       echo "In file $errfile, Line $errline: $errstr";
    }
  }
};

// Set the callback as your error handler
// Apply it only to E_NOTICE using the second parameter $error_types
// so that PHP handles other errors in its normal way.
set_error_handler($error_handler, E_NOTICE);

注意:以上内容不会自动移植到其他英语。但如果只是为了你自己的目的或有限的使用,那可能不是问题。

【讨论】:

  • 使用 php 5.2.17 此代码无法编译。我想我不能以这种方式使用函数。我在第一行有这个错误:“解析错误:语法错误,意外的 T_FUNCTION,期待')'。”
  • 没关系,你写得很快,有一些错误^^,我一个人可以解决这个问题。感谢您的有用帮助。
猜你喜欢
  • 1970-01-01
  • 2019-03-21
  • 1970-01-01
  • 2021-09-14
  • 1970-01-01
  • 2013-09-29
  • 1970-01-01
  • 2021-11-29
  • 1970-01-01
相关资源
最近更新 更多