可以为库代码而不是我的代码关闭E_STRICT吗?

时间:2010-02-23 15:06:07

标签: php error-reporting

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

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

我知道可以使用.htaccess文件在每个目录的基础上更改error_reporting,但我认为这不适用于包含的文件。我尝试将它放在梨文件夹中,但它没有做任何事情。

4 个答案:

答案 0 :(得分:5)

您可以使用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

答案 1 :(得分:5)

您可以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;
}

答案 2 :(得分:0)

不,不可能。有

ini_set('error_reporting', E_NOTICE);

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

答案 3 :(得分:0)

作为一个非常脏的黑客,您可以扩展所有类并依赖于神奇的__call方法。这是我的头脑,所以不要拍我的错别字/脑筋:

class MyDb {
    protected $pearDb; // Instantiate this in your constructor.
    public function __call() {
        $oldReporting = error_reporting(~E_STRICT);
        $result = call_user_func_array(array($this->pearDb, __FUNCTION__), func_get_args());
        error_reporting($oldReporting);
        return $result;
    }
}

如果您希望我更详细地解决这个问题,请告诉我。