PHP @ operator for include не отключает error_reporting

Я ищу лучшее решение, как отключить известные предупреждения (и не относится к моему сценарию), о которых сообщается из включенного файла.

Краткое описание прилагаемого файла:

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

то оператор @ работает так, как ожидалось …

@ работает только для выражения, с которым он был использован. Он не может отключить отчет об ошибках для включенного файла. Я просто скрою предупреждение, когда PHP не может включать файл.

Вы можете подавлять ошибки разными способами, если вы не хотите использовать 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 ); } 

Как правило, не рекомендуется отключать предупреждения. Вы можете исправить свои уведомления Undefined Variable, используя Ternary Operators, например:

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

Если вы поместите это после кода, который должен установить переменную, и перед использованием этой переменной он определит, если он еще не определен.

Оператор подавления ошибок @ может использоваться для операторов, условий и даже для языковых конструкций. Однако, хотя он может использоваться для вызовов функций или методов, он не может использоваться при объявлении функций или классов.

Он просто скрывает ошибки, но ошибки все еще есть!

См. Этот пример.

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