【问题标题】:Possible to turn off E_STRICT for library code but not my code?可以关闭库代码的 E_STRICT,但不能关闭我的代码?
【发布时间】:2011-01-20 02:52:51
【问题描述】:

是否可以更改我的 PHP 应用程序包含 includerequire_once 的文件的错误报告级别(关闭 E_STRICT)?

我希望能够看到我的代码中出现的严格通知,但我使用的是 PEAR MDB2,当我打开 E_STRICT 时,我会从该代码中收到几页警告。

我知道可以使用 .htaccess 文件在每个目录的基础上更改 error_reporting,但我认为这不适用于包含的文件。我试着把它放在梨文件夹中,但它什么也没做。

【问题讨论】:

  • 也许沉默包括? @include?

标签: php error-reporting


【解决方案1】:

您可以在运行时使用ini_set() 动态更改error_reporting 设置。这是一个例子:

// your running code using the default error reporting setting

// set the error reporting level for your library calls
ini_set('error_reporting', E_NOTICE);

// make some library calls

// reset the error reporting level back to strict
ini_set('error_reporting', E_ALL & E_STRICT);

// more of your code

【讨论】:

  • 他准确地问了一些完全不同的东西。
  • 这解决了他的问题。请允许我扩展我的答案并解释原因。他可以设置错误报告级别,进行库调用,然后将其重新设置。
  • @Adam Kiss:不,他不是......他说他想要一些与使用 .htaccess 不同的东西,这 与使用 .htacess 不同的东西。 Asaph 可能会更清楚,并表明您可以在对 ini_set() 的两次调用之间包含库调用。
  • @Adam Kiss and gnud:我已经扩展了我的答案。请查看。
  • 你不能在error_reporting() 之间也包含库吗?是的你可以。但是,如果您以后使用该库中的函数,这并不能解决错误报告,是吗?
【解决方案2】:

不,不可能。有

ini_set('error_reporting', E_NOTICE);

但这会影响您的所有函数/方法调用,即使它们是在其他/库文件中定义的。

【讨论】:

    【解决方案3】:

    作为一个非常肮脏的 hack,您可以扩展所有类并依赖神奇的 __call 方法。这不是我的想法,所以不要因为错别字/脑残而开枪:

    类 MyDb { 受保护的$pearDb; // 在你的构造函数中实例化这个。 公共函数 __call() { $oldReporting = error_reporting(~E_STRICT); $result = call_user_func_array(array($this->pearDb, __FUNCTION__), func_get_args()); 错误报告($oldReporting); 返回$结果; } }

    如果你想让我更详细地解决这个问题,请告诉我。

    【讨论】:

      【解决方案4】:

      您可以define a custom error handler,并使用$errfile 参数来确定错误的来源。如果路径与您包含的库的路径匹配,则禁止错误。否则,将其传递给 PHP 的错误报告。

      据我所知,这应该可以捕获由库引起的所有警告和通知。

      因为不需要回溯,所以对于很多触发消息来说它可能已经足够快了。

      根据手册中的示例,这未经测试但应该可以工作:

      <?php
      // error handler function
      function myErrorHandler($errno, $errstr, $errfile, $errline)
      {
      
          $library_path = "/path/to/library";
          if (substr($errfile,0,strlen($library_path))==$library_path)
          /* Don't execute PHP internal error handler */
           return true;
          else
          /* execute PHP internal error handler */
           return false;
      }
      

      【讨论】:

      • 对,这显然是比我的 hack 更好的解决方案。不过,您可能还想在忽略错误之前检查 $errno 和 E_STRICT,否则您会错过有效的警告等。
      • @janmoesen 我认为 OP 的问题是图书馆(他无法影响)会引起通知和警告,他想完全关闭它们。如果不是这样,检查错误级别确实是个好主意。
      猜你喜欢
      • 2011-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多