为什么在PHP中禁用E_警告被认为是不好的做法?

为什么在PHP中禁用E_警告被认为是不好的做法?,php,security,conventions,suppress-warnings,Php,Security,Conventions,Suppress Warnings,据我所知,至少在PHP v7.3中,这是生产系统的“最佳实践”PHP值: 我注意到此报告E_警告 我对忽略警告的负面影响感兴趣,例如: ini_set('error_reporting', E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED & ~E_WARNING); 这会掩盖警告,从长远来看,这将对项目中的代码质量有害。到目前为止,忽视警告显然是一种不好的做法 然而,让我们在混合中加入另一个因素。如果出现报告的错误,通

据我所知,至少在PHP v7.3中,这是生产系统的“最佳实践”PHP值:

我注意到此报告
E_警告

我对忽略警告的负面影响感兴趣,例如:

ini_set('error_reporting', E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED & ~E_WARNING);
这会掩盖警告,从长远来看,这将对项目中的代码质量有害。到目前为止,忽视警告显然是一种不好的做法

然而,让我们在混合中加入另一个因素。如果出现报告的错误,通常会配置自定义PHP错误处理程序来停止应用程序。例如,Yii1函数终止应用程序。我想很多PHP框架都采用相同的方法。这实际上会引起一些混乱,因为

E_警告运行时警告(非致命错误)。脚本的执行未停止

但是(至少在Yii1中),如果值中包含
E_WARNING
(由于yii自定义错误处理程序),脚本的执行将停止

在我当前的项目中,
E_WARNING
是在测试系统上报告的,但目前尚未投入生产,修复所有警告可能需要80个小时,以便我们能够启用它并遵循最佳实践。我认为这是值得努力的,我将向团队提出这一建议,但我需要为项目带来一些好处,否则投资回报率将被认为太低。到目前为止,我只有两项福利:

  • 从长远来看,这对代码质量是最好的
  • 如果出现警告,不停止可能是一个安全问题。我能想到的一个例子是,警告可能与无效的regexp有关(过去已知无效的regexp易受攻击)。有时,用户输入用于regexp,这无疑会打开攻击向量
  • 你能想到其他原因吗


    总结我的问题(TL;DR):


    如果出现
    E_警告
    ,不停止应用程序有什么危险?

    您应该将所有警告视为错误。基本上,警告是不会停止脚本执行的错误。在这种情况下,它们可能被认为比错误更危险。如果前面的操作失败,您通常不希望应用程序继续执行。对于一个编码错误的程序来说,这可能是灾难性的

    警告告诉您代码存在严重问题,而不是您的代码没有遵循最佳实践

    有一个计划是在PHP的未来版本中增加所有错误的严重性。看


    如果您可以忽略所有警告,并且代码仍然正确执行,那么这就是严重代码气味的迹象。应尽快记录并修复所有警告。它们不应被视为潜在的bug,而应被视为现有bug

    理想情况下,您的团队应该在软件投入生产(测试和QA)之前修复所有导致警告的原因,毕竟隐藏的问题仍然是一个问题。有一个关于错误的快速阅读。

    老实说,我刚刚读了TLDR。但是你不应该抑制警告,你应该处理它们。也就是说,您应该解释输入/数据出错的原因,并采取相应的行动。抑制错误可能会导致代码在没有适当数据的情况下运行,这可能会导致问题进一步恶化。更多的“防御”代码通常对最终用户更有利(他们会收到一条关于他们做错了什么的消息),并且它确保代码只使用适当的数据运行。E_警告不会破坏应用程序的行为。这就是为什么,它只在dev环境中有用。没有人希望为最终用户显示未处理的警告消息。
    ini_set('error_reporting', E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED & ~E_WARNING);