用于抑制严格标准消息的PHP机制

时间:2011-11-22 04:36:46

标签: php php-5.3 error-reporting

我们正在开发一个为5.2开发的PHP应用程序,但我们最近迁移到了PHP 5.3。我们没有时间来解决迁移到PHP 5.3的所有问题。具体来说,我们有很多消息:

  

Object :: Function的声明应该与   父::功能

我们可以随着时间的推移解决这些问题,但这需要几周的时间。与此同时,我们可以设置:

error_reporting = E_ALL & ~E_STRICT

但这是为整个脚本全局设置的。我们希望继续为我们编写的新代码获取E_STRICT消息。是否可以仅指示应忽略E_STRICT消息的功能?我正在考虑类似于Java的@SuppressWarnings注释。

2 个答案:

答案 0 :(得分:0)

不幸的是,在编译时,可能会抛出像你提到的严重错误,而不是运行时。如上所述in the docs

  

警告
  因此,大多数 E_STRICT 错误在编译时进行评估   在error_reporting所在的文件中不会报告此类错误   增强以包含 E_STRICT 错误(反之亦然)。

如果是这种情况,也许你可以像在那里一样禁用php.ini中的E_STRICT错误,

error_reporting = E_ALL & ~E_STRICT

但是在运行时使用error_reporting();

启用它们
error_reporting(E_ALL|E_STRICT);

也许这会跳过所有编译时间? (免责声明:听起来不错,但我还没试过。)

如果不是在编译时抛出的错误,您可以执行相反的操作并在php.ini中启用它们,并且只在您想要的部分中使用error_reporting()禁用它们忽略,或者通过设置set_error_handler()的自定义错误处理程序,有选择地忽略从某些地方抛出的严格错误。

答案 1 :(得分:0)

不幸的是,php的@抑制器仅适用于表达式而不是类定义。您的具体示例似乎也与bug绑定,现在标记为虚假。但我认为这是一个错误,但我认为该警告实际上应该显示 more 。< / p>

但是,您可以做的是在整个脚本中多次更改error_reporting级别,假设您的新代码很容易与旧代码分开。如果你正在使用相同的课程,虽然这会变得更加困难。

您可以使用错误处理程序来过滤一些您不想报告的函数和方法,但是:

set_error_handler('GOON', E_STRICT);
function GOON($errno, $errstr) {
   if (is_strict_function($errstr)) {
      echo "$errstr\n";
   }
}
function is_strict_function($str) {
   foreach (
      array(
         'xzin::goon'
         //Other functions or methods go here
      )
      as $fnc
   ) { 
      if (strpos($str, $fnc) !== false) {
         return false;
      }
   }
   return true;
}

error_reporting(E_ALL | E_STRICT);

class xzin extends zin {
   function goon($a) {}
}
class tzin extends zin {
   function goon($a) {}
}
class zin {
   function goon() {}
}

打印:“tzin :: goon()的声明应该只与zin :: goon()的声明兼容。