【问题标题】:PHP @ operator for include doesn't disable error_reporting用于包含的 PHP @ 运算符不会禁用 error_reporting
【发布时间】:2013-09-20 09:13:09
【问题描述】:

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

包含文件的简短示例:

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

那么@运算符按预期工作......

【问题讨论】:

  • 错误很明显?只需在包含的文件中设置$y(也可能设置$e?也就是说,不要使用@ 运算符来删除通知/警告。这是一个坏习惯,而且更难弄清楚在哪里发生错误。
  • @ 运算符只是意味着它不会因为实际的include 而输出错误,例如找不到包含的文件等错误。它不会转包含所有代码的关闭错误。
  • 我刚刚使用了 $x = $y;触发php错误。我可以改用 trigger_error()。

标签: php error-handling


【解决方案1】:

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

【讨论】:

  • 谢谢。但是如果包含的文件没有将 error_reporting 转回 E_ALL,@ 实际上会隐藏错误。但我明白了,使用 @ 确实是个坏主意。
  • @Predkambrij 我刚刚检查过,很奇怪,但你绝对是对的。唯一的例外是当您在父文件中调用函数/方法时,将显示此调用的所有错误/通知。
【解决方案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.

【讨论】:

  • 举个例子,让我大吃一惊!
  • 就像@someFunction(); 一样简单。也许你谈论函数声明?那么请编辑您的答案以更好地表达它。
  • 我有没有提到函数调用?看你的第一条评论,你应该说函数调用。
  • @Elon 提出了一个公平的观点,对此本可以作出澄清。我提出了改进建议,所以请检查您是否同意。
【解决方案3】:

如果你不想要 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 );
} 

【讨论】:

    【解决方案4】:

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

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

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

    【讨论】:

    • PHP7.2+ 是$y = $x ?? '';
    猜你喜欢
    • 2021-04-23
    • 2010-11-01
    • 2015-08-26
    • 2014-09-04
    • 2020-07-13
    • 1970-01-01
    • 2011-12-21
    • 1970-01-01
    • 2017-02-05
    相关资源
    最近更新 更多