Я использую isset()
только для $_GET
и $_SERVER
переменных, где данные поступают из вне контроля моего приложения. И я использую его в какой-то другой ситуации, когда у меня нет времени написать правильное решение ООП, чтобы избежать этого, но я уверен, что этого можно избежать в большинстве, если не во всех местах. Например, лучше использовать классы вместо ассоциативных массивов, так что вам не нужно проверять наличие ключа массива.
Мои советы:
- Избегайте использования оператора
@
.
- Использование Xdebug . Во-первых, он печатает легко читаемые и легко заметные сообщения о каждом уведомлении / предупреждении, а также печатает очень полезную трассировку стека для исключений (вы можете настроить его для печати каждого параметра метода и каждой локальной переменной (* 1024) * и
xdebug.show_local_vars=on
параметры конфигурации.) Во-вторых, он может отключить оператор @
с помощью значения конфигурации xdebug.scream=1
. Вы можете использовать Xdebug для профилирования , а также для анализа покрытия кода. Это на вашем компьютере разработчика должно быть .
- Для отладки я также использую FirePHP , потому что он работает с Firebug и способен печатать сообщения на Консоль Firebug , поэтому ее можно использовать и для AJAX-отладки .
- С помощью пользовательского обработчика ошибок вы можете перехватывать и фильтровать любые ошибки и предупреждения, а также регистрировать их в файл или отображать их с помощью FirePHP, или вы можете использовать, например, jGrowl или Gritter , чтобы красиво отображать их на веб-странице.
Я использую модифицированную версию примера в руководстве по PHP :
<code><?php
//error_reporting(0);
set_error_handler("errorHandler");
function errorHandler($errno, $errstr, $errfile, $errline)
{
echo "errorHandler()<br />\n";
// filter out getImageSize() function with non existent files (because I'am avoiding using file_exists(), which is a costly operation)
if ( mb_stripos($errstr, 'getimagesize') !== false )
return true;
// filter out filesize() function with non existent files
if ( mb_stripos($errstr, 'filesize') !== false )
return true;
// consoleWriter is my class which sends the messages with FirePHP
if (class_exists('consoleWriter'))
consoleWriter::debug(array('errno'=>$errno, 'errstr'=>$errstr, 'errfile'=>$errfile, 'errline'=>$errline, 'trace'=>debug_backtrace()), "errorHandler");
switch ($errno) {
case E_USER_ERROR:
$out .= "<b>FATAL_ERROR</b> <i>$errno</i> $errstr<br />\n";
$out .= "Fatal error on line $errline in file $errfile";
echo "</script>$out"; // if we were in a script tag, then the print is not visible without this
//writeErrorLog($out);
echo "<pre>";
var_export(debug_backtrace());
echo "
";
выход (1);
перерыв;
case E_USER_WARNING:
$ out. = "
ПРЕДУПРЕЖДЕНИЕ $ errno $ errstr
\ n";
$ out. = "В строке $ errline в файле $ errfile
\ n";
перерыв;
case E_USER_NOTICE:
$ out. = "
УВЕДОМЛЕНИЕ $ errno $ errstr
\ n";
$ out. = "В строке $ errline в файле $ errfile
\ n";
перерыв;
дефолт:
$ out. = "
Неизвестно $ errno $ errstr
\ n";
$ out. = "В строке $ errline в файле $ errfile
\ n";
перерыв;
}
if (! class_exists ('consoleWriter'))
эхо $ out;
// writeErrorLog ($ из);
// addJGrowlMessage ($ из);
// Не выполнять PHP-обработчик внутренних ошибок
вернуть истину;
}
функция testNotice ($ a)
{
эхо $ а;
}
testNotice ();
Еще один совет - не использовать закрывающий тег ?>
в конце файлов только для php, потому что это может вызвать headers already sent
ошибок в конфигурациях, где выходная буферизация по умолчанию отключена .