尽管未设置但抛出 E_STRICT 消息

Posted

技术标签:

【中文标题】尽管未设置但抛出 E_STRICT 消息【英文标题】:E_STRICT messages thrown though not set 【发布时间】:2011-06-09 05:51:43 【问题描述】:

自从将我的测试服务器更新到 php 5.3.3 (Debian Squeeze) 后,我遇到了关于 PHP 错误报告的奇怪行为。

我这样设置error_reporting:

error_reporting(E_ALL);

并通过

检查设置
echo error_reporting();

呼应30719。根据php.net,这意味着“支持的所有错误和警告,E_STRICT 级别除外。”。

但在下一行(类定义abstract class formInputContainer extends formContainer implements formElementValueable ... )中,这会导致消息:

Strict (2048):formInputContainer::addElement() 的声明应该与 formContainer::addElement() 的声明兼容

为什么没有设置 E_STRICT 消息却被回显?即使更改为 E_ALL 和 ~E_STRICT 也无济于事。

【问题讨论】:

这可能是为了帮助; php.net/manual/en/function.error-reporting.php#98414 @Chris:谢谢,也许我也有同样的行为。乍一看,这对我来说听起来像是一个错误,因为它没有在任何地方提及。 不客气!我同意你的看法,很遗憾,我无法就此事向你提供任何深入的信息,因为我刚刚发现它试图帮助你解决问题。 【参考方案1】:

即使它们未设置,您也看到它们的原因是它们在编译时抛出(嗯,解析时)。这意味着在您拨打 error_reporting() 之前会触发错误。真正的解决方法是更改​​php.ini 设置以从定义中删除E_STRICT。为确保您正在编辑正确的文件,请检查phpinfo()

【讨论】:

+1 但奇怪的是,在我的脚本中使用 error_reporting 和 E_ALL 会使严格的警告消失...(PHP 5.3.3)。 @netcoder:在一个文件中,然后调用require 加载类,是的。但是如果你把这个调用放在一个包含类的文件中,它不会影响任何东西...... @Netcoder:它为我做到了。如果我将 error_reporting 调用放在同一个文件中,仍然会抛出错误(设置 php.ini 以报告错误)...您确定要在 5.3+ 上进行测试吗?【参考方案2】:

如果这是一个自定义错误处理程序(通过set_error_handler() 设置),您必须自己检查当前的error_reporting 级别。自定义错误处理程序获取所有错误消息:

manual 说:

重要的是要记住,对于由 error_types 指定的错误类型,标准的 PHP 错误处理程序完全被绕过,除非回调函数返回 FALSE。 error_reporting() 设置将不起作用,并且无论如何都会调用您的错误处理程序 - 但是您仍然能够读取 error_reporting 的当前值并采取适当的行动。

【讨论】:

你说得对——这就是问题所在,谢谢!这种行为在 PHP 5.3 中改变了,是吗?在 5.2 中,这从来都不是问题。 这很奇怪。 Afaik,没有这样的变化。但是,"declaration should be compatible..." 在 PHP 5.2 中是一个“致命错误”,不能被自定义错误处理程序捕获。希望对您有所帮助。

以上是关于尽管未设置但抛出 E_STRICT 消息的主要内容,如果未能解决你的问题,请参考以下文章

角度处理json对象编译但抛出错误

JWT 解密,但抛出 mac check failed 错误

带有 ***Service 的 Android 防火墙。响应已传递,但抛出 SocketTimeoutException

Django Ajax 表单工作但抛出 500(内部服务器错误)

尝试在 JAVA Spring,@AutoWired 过滤器服务,但抛出 NPE

流星对象在控制台中可用,但抛出“无法读取属性 findOne of undefined”