PHP机制抑制严格标准消息

PHP Mechanism to Suppress Strict Standards Messages

提问人:Brian Fisher 提问时间:11/22/2011 更新时间:11/22/2011 访问量:1628

问:

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

Object::Function 的声明应与 父级::函数

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

error_reporting = E_ALL & ~E_STRICT

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

php-5.3 错误报告

评论


答:

0赞 Wiseguy 11/22/2011 #1

不幸的是,像你提到的严格错误很可能是在编译时抛出的,而不是在运行时抛出的。如文档中所述:

警告
因此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中启用它们,并且只在要忽略的部分中禁用它们,或者通过使用 set_error_handler() 设置自定义错误处理程序来选择性地忽略从某些位置抛出的严格错误。error_reporting()

0赞 Explosion Pills 11/22/2011 #2

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

但是,您可以做的是在整个脚本中多次更改级别,假设您的新代码很容易与旧代码分开。如果您使用相同的类,这将变得更加困难。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() 的声明仅兼容”。