1

我正在寻找如何禁用从包含文件报告的已知警告(以及与我的脚本无关的警告)的最佳解决方案。

包含文件的简短示例:

$ cat incl_file.php 
<?php
error_reporting(E_ALL);
ini_set("display_errors", "on");


$x = $y;

?>

所需代码的示例(不会阻止显示包含文件中的错误)

$ cat main2.php 
<?php
error_reporting(E_ALL);
ini_set("display_errors", "on");

@include_once "incl_file.php";

$d=$e;

print "main_file\n";
?>

输出:

$ php main2.php 

Notice: Undefined variable: y in /tmp/php_hack/incl_file.php on line 6

Notice: Undefined variable: e in /tmp/php_hack/main2.php on line 7
main_file

以下“解决方法”有效,但我对它的混乱不满意:

<?php

function myErrorHandler($errno, $errstr, $errfile, $errline) {
    if (!(error_reporting() & $errno)) {
        // This error code is not included in error_reporting
        return;
    }
    //print "called $errstr\n";
    /* Don't execute PHP internal error handler */
    return true;
}

set_error_handler("myErrorHandler");
error_reporting(0);
ini_set("display_errors", "off");

include_once "incl_file.php";

restore_error_handler();

error_reporting(E_ALL);
ini_set("display_errors", "on");

$d=$e;

print "main_file\n";
?>

输出:

$ php main.php 

Notice: Undefined variable: e in /tmp/php_hack/main.php on line 24
main_file

如果包含的文件没有

error_reporting(E_ALL);
ini_set("display_errors", "on");

然后 @ 运算符按预期工作......

4

4 回答 4

3

@运算符仅适用于使用它的表达式。它不能禁用包含文件的错误报告。当 PHP 无法包含文件时,我只会隐藏警告。

于 2013-09-20T09:16:19.320 回答
1

错误抑制运算符@可用于运算符、条件甚至语言结构。但是,虽然它可以用于函数或方法调用,但不能在声明函数或类时使用。

它只是隐藏了错误,但错误仍然存​​在!

请参阅此示例。

<?php
@require_once("xxccc.php"); // FATAL error occurred (error won't be printed!)
                            // and program exits without error since the error
                            // suppression operator.
echo "Hello"; // This won't be printed on the screen.
于 2013-09-20T09:22:09.520 回答
0

禁用警告通常不是一个好主意。您可以使用三元运算符修复未定义变量通知,如下所示:

$variable = isset($variable) ? $variable : '';

如果你把它放在应该设置变量的代码之后,并且在使用变量之前,它将定义它是否尚未定义。

于 2013-09-20T09:18:49.173 回答
0

如果您不想要 php,您可以通过多种方式抑制错误,例如在 .htacces 中使用:

php_flag display_errors off

无论如何@都是不好的做法,并且还在每个文件中设置不同的错误报告

您应该有一些配置文件,在其中说明您想看到或不看到哪些错误,并且在发布时不要显示它们,这可能是安全漏洞,空白页还是更好。

if($state == "testing" )
{
 ini_set( "display_errors", "1" );
 error_reporting( E_ALL & ~E_NOTICE );
}
else
{
 error_reporting( 0 );
} 
于 2013-09-20T09:24:54.673 回答