PHP @运营商包括不禁止的error_reporting(PHP @ operator for i

2019-10-18 16:18发布

我在寻找最佳的解决方案如何禁用知警告(和我的脚本不相关的警告),从所包含的文件报告。

包含文件的简单的例子:

$ 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");

然后@操作按预期工作...

Answer 1:

@操作仅适用于与它被用来表达。 它不能禁用错误包含的文件报告。 我就躲警报当PHP不能包含文件。



Answer 2:

错误抑制操作@可以在运营商,条件,甚至在语言结构中使用。 然而,虽然它可以在函数或方法调用中使用,它不能被声明函数或类时使用。

它只是隐藏的错误,但错误依然存在!

看到这个例子。

<?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.


Answer 3:

你可以在很多方面抑制的错误,如果您在使用本.htacces不想PHP,例如:

php_flag display_errors off

反正@是不好的做法,并在每个文件还设置不同的错误报告

你应该有一些配置文件,在那里你说出你想看到或没有什么错误,offcourse当上发布,不告诉他们,这可能是安全漏洞,空白页仍然是更好的。

if($state == "testing" )
{
 ini_set( "display_errors", "1" );
 error_reporting( E_ALL & ~E_NOTICE );
}
else
{
 error_reporting( 0 );
} 


Answer 4:

它一般不会禁用警告是个好主意。 您可以通过使用三元运营商,像这样解决您的未定义的变量声明:

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

如果你把一个应该设置变量的代码后,并使用变量之前,如果没有定义将定义。



文章来源: PHP @ operator for include doesn't disable error_reporting