PHP @ operator for include不会禁用error_reporting

时间:2013-09-20 09:13:09

标签: php error-handling

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

包含文件的简短示例:

$ 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 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分: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.

答案 2 :(得分:0)

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

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

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

答案 3 :(得分: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 );
}