2013-09-20 4 views
0

Я ищу лучшее решение, как отключить известные предупреждения (и не относится к моему сценарию), о которых сообщается из включенного файла.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"); 

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

+0

Ошибка очевидна? Просто установите '$ y' в ваш включенный файл (а также, возможно,' $ e'? Тем не менее, не используйте оператор '@' для удаления уведомлений/предупреждений. Это плохая привычка, и это затрудняет цифру где происходят ошибки. – h2ooooooo

+0

Оператор '@' просто означает, что он не будет выводить ошибки в результате фактического 'include', такого как ошибка, которую не удалось найти включенному файлу и т. Д. Он не отключает ошибки для всего включенного кода. – Anthony

+0

Я просто использовал $ x = $ y; для запуска php-ошибки. Вместо этого я мог бы использовать trigger_error(). – Predkambrij

ответ

3

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

+1

Спасибо. Но @ на самом деле скрывает ошибки, если включенный файл не превращает error_reporting обратно в E_ALL. Но я вижу, что использование @ - это действительно плохая идея. – Predkambrij

+0

@Predkambrij Я просто проверил это, странно, но ты определенно прав. Единственное исключение - это когда вы вызываете функцию/метод в родительском файле, тогда будут отображаться все ошибки/уведомления из этого вызова. –

0

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

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

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

0

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

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

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

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

Вы ошибаетесь. Вы можете использовать '@' с функциями и методами. –

+0

Приведите пример и поразите меня! –

+0

Так же просто, как '@someFunction();'. Может быть, вы говорите о объявлениях функций? Затем, пожалуйста, отредактируйте свой ответ, чтобы выразить его лучше. –

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); 
} 
Смежные вопросы