PHP通知抑制;只有某些情况/方法

PHP通知抑制;只有某些情况/方法,php,error-handling,error-reporting,error-suppression,e-notices,Php,Error Handling,Error Reporting,Error Suppression,E Notices,tl;dr-在非常严格的环境中工作时,有没有一种有效的方法来管理PHP的错误报告级别,因为使用较低的级别可以简化某些流程 好,;首先,我不相信“错误抑制”是一个解决方案。我(合理地确定我)从未使用过@错误抑制运算符,也无意这样做。我利用set\u error\u handler()和ErrorException(或某种派生)并在错误报告(-1)(未来证明E|u ALL | E|u STRICT) 现在,我不想改变这些习惯,因为我发现它们是一种很好的实践(而且,如果有人对进一步改进我的开发/生产环

tl;dr-在非常严格的环境中工作时,有没有一种有效的方法来管理PHP的错误报告级别,因为使用较低的级别可以简化某些流程

好,;首先,我不相信“错误抑制”是一个解决方案。我(合理地确定我)从未使用过
@
错误抑制运算符,也无意这样做。我利用
set\u error\u handler()
ErrorException
(或某种派生)并在
错误报告(-1)
(未来证明
E|u ALL | E|u STRICT

现在,我不想改变这些习惯,因为我发现它们是一种很好的实践(而且,如果有人对进一步改进我的开发/生产环境设置/实践提出建议,我洗耳恭听)

然而,当涉及到视图生成时,这可能会变得有点乏味。如果控制器由于任何原因未能将某些数据传递给视图,则正确的数据(数组索引、变量等)并不总是可用的。只要该数据对视图生成不重要,视图仍应渲染

我比较喜欢这种语法,因为它不冗长,但(我认为)非常容易理解:

// e() is a shortcut function; given the passed value evaluates to a boolean true
// it will echo() and return true, otherwise it simply returns false
<p><?php e($data['field']) or e('No data found'); ?></p>
但这似乎不是最干净(也不是最安全)的解决办法;尤其是在视图中调用辅助函数时。我选择了一种HMVC方法,子请求可以从视图中发出,因此我需要找到所有
render()
转义点,并使用
错误报告(-1)
保护它们

我还有其他选择吗?

即使在视图模板中,“未定义变量”通知也非常有价值,因为它们有助于发现输入错误;但这需要定义控制器中的每个变量,或者检查它们是否在视图中设置

正如您所注意到的,这两个明显的解决方案都有一些开销或缺点。即使禁用错误报告也有一些开销,因为仍然会生成错误(错误消息是格式化的,调用内部和用户错误处理程序,等等;它们只是隐藏的)。这会对您可能从视图中调用的帮助器方法隐藏错误;这无助于调试


我建议您使用模板引擎。有些生成PHP代码的速度与手写代码一样快。他们将为您处理此问题,并将做更多的工作(如转义,您的视图中还应该充斥着htmlspecialchars()调用;)。

继续报告E_通知,这是值得的。也就是说,我同意
未定义索引
与未定义变量的错误程度不同,而且
isset($options['boolean\u flag')和&$options['boolean\u flag']
有点难看。我所从事的一个项目中有数千个这样的通知,因此为了不断看到E_通知级别的错误,而不被
未定义的索引淹没,我实际上重新编译了该语言以忽略特定类型的通知。(我使用的是hvm而不是PHP,但两者的区别相同)

是的,这是一个极端的解决方案,但这是一个在紧要关头的选择。显然,您将希望使用基于生产的正式构建


注意:我写下了重新编译的步骤,如果有人愿意尝试,我可以发布,但这有点超出了原始问题的范围。

我没有100%了解您想要什么。。但是也许php函数可以帮助你;博士:你应该避免使用代码,因为它会抛出任何东西,包括通知。@KingCrunch-是的,是的;这就是我最初选择树/节点想法的原因。我选择不参加演出,但我现在犹豫不决。当然,控制器和视图之间的数据完整性和安全性将是最佳的,但在本例中,我追求灵活性。感谢@user576875-我尝试了一些模板引擎,甚至推出了自己的(一个基于regex的,一个基于DOM的),但它们从来没有像普通PHP那么快。对快速的有什么建议吗?(同样
e()
进行转义,它需要比我提到的更多的参数,以及其他辅助函数)
// View::render()
public function render($data){
    error_reporting(E_ALL & ~E_NOTICE);
    // view generation logic
    error_reporting(-1);
}