Исходники
Статьи
Языки программирования
.NET Delphi Visual C++ Borland C++ Builder C/С++ и C# Базы Данных MySQL MSSQL Oracle PostgreSQL Interbase VisualFoxPro Веб-Мастеру PHP HTML Perl Java JavaScript Протоколы AJAX Технология Ajax Освоение Ajax Сети Беспроводные сети Локальные сети Сети хранения данных TCP/IP xDSL ATM Операционные системы Windows Linux Wap Книги и учебники
Скрипты
Магазин программиста
|
Пишем PHP код, устойчивый к ошибкамПредисловиеОшибки - это бич любой программы. Чем больше проект, тем труднее исправлять и находить ошибки. Но наиболее важным в процессе работы с программой является квалификация программиста и его желание написать правильный и аккуратный код, содержащий минимальное количество ошибок. В этой статье я постараюсь собрать техники и приемы, позволяющие минимизировать количество ошибок в программе, написанной на PHP. Но некоторые из представленных методов могут пригодится если вы пишите на любом языке программирования. Знание - половина успехаУзнаем, о чем сообщает PHPВ любом языке существует множество потенциально опасных ситуаций, которые чреваты неявными ошибками. При разборе транслятором исходного кода программы он может сообщать разработчику об этих ситуациях. Для этого надо лишь включить соответствующую опцию, которая очень часто по умолчанию выключена по некоторым соображениям. В PHP контроль вывода сообщений транслятора определяется функцией error_reporting и значением директивы
Для включения максимально подробного вывода сообщений транслятора поставьте в начале программы вызов функции error_reporting: // Для PHP4 error_reporting(E_ALL); или поставьте значение С более подробном описании возможных уровней reporting можно знакомится в PHP документации - Error Handling and Logging Functions. Для PHP5 введен уровень // Для PHP5 error_reporting(E_ALL | E_STRICT); Если ни о чем не сообщаетЕсли Вы установили вывод ошибок и ошибки по не выводятся, то возможно вывод ошибок в script output отключен. Проверьте значение опции ini файла display_errors (она включает вывод ошибок непосрественно в script output) и, если она выключена, включите её. // проверяет значение опции display_errors if (ini_get('display_errors') != 1) { // включает вывод ошибок вместе с результатом работы скрипта ini_set('display_errors', 1); } Если вдруг сообщитКрайне редко удается протестировать программу полностью до выпуска и в то-же время лучше не показывать пользователю сообщения об ошибках ибо его реакция на них непредсказуема. Лучше перенаправлять ошибки транслятора, которые произошли непосредственно во время работы программы, в log файл ошибок. Включить это перенаправление можно опцией log_errors в файле php.ini. Полезно также поставить свой обработчик ошибок, если Вы хотите не только заносить ошибки в Log файл но и добавить некоторую дополнительную логику их обработки. Например, отправить письмо при сообщении транслятора или вывести некоторое специальное сообщение для пользователя. Подробнее об этом написано в статье Ловля ошибок в PHP, которую написал Антон Довгаль. Сравниваем константу с переменной, а не наоборотСколько раз Вам приходилось выяснять, что ошибка в программе связанна с
использованием оператора " if (10 == $i) { // что-то делаем } В случае использования " Не используем значение дваждыКонечно, это преувеличение. Но если в программе возникает необходимость использовать значение несколько раз, можно порекомендовать объявить константу и использовать её вместо значения. Для PHP4 существует единственный способ объявить константу - использовать
функцию Например: define ('BEFORE_RENDER', 'beforeRender'); Констант в классах объявлять нельзя. Расширение PHP 5 для определения констант сходно с тем, которое было осуществлено при расширении от C до C++ - используется ключевое слово const. Но константы таким образом можно создавать только внутри классов. Например: class ControlEvents { const BEFORE_RENDER = 'beforeRender'; } print ControlEvents::BEFORE_RENDER; Но для обращения к такой константе необходимо знать имя класса. Константы могут быть также добавлены непосредственно в класс. Но PHP не поддерживает такой метод. Поэтому придется объявить их как обычные переменные: class Control { var $BEFORE_RENDER = 'beforeRender'; function render() { $eventFunction = $this->BEFORE_RENDER; $this->$eventFunction(); } } Проверка параметров функцииВ PHP параметром в функцию можно передать любую переменную. Но вот алгоритму функции может быть вовсе не все равно, что за переменную ему передали. Поэтому в начале функции полезно проверять её входные параметры на необходимый тип и диапазон значений. Для проверки типа используются следующие функции:
Для PHP4 не существует автоматического способа проверки параметров функции. Все необходимые проверки необходимо делать самостоятельно. Код функции, осуществляющей проверку аргументов, может быть примерно такой: /** * Функция showControl принимает один параметр $control, * этот параметр должен являться классом и являться * экземпляром класса HTMLControl либо классом, * унаследованным от HTMLControl. */ function showControl(&$control) { is_a($control, 'HTMLControl') or $control == null or exit('Type missmatch.'); ... } Достоинство этого метода состоит в том, что можно управлять сообщениями об ошибках и использовать собственный обработчик ошибок. Например, Вы можете использовать следующие функции для проверки параметров: function checkParameter(&$var, $class) { if (!is_a($var, $class) && $var != null) SFExit('Type missmatch.'); } function SFExit(&$message) { print $message . '<br>'; $backtrace = debug_backtrace(); for($i = 0; $i < count($backtrace); $i++) { print $i . ': ' . $backtrace[$i]['file'] . '(' . $backtrace[$i]['line'] . ')<br>'; } exit(); } Примечание: Функция debug_backtrace введена только в PHP 4.3.0. Пример их применения: function showControl(&$control) { checkParameter($control, 'HTMLControl'); ... } Для PHP5 некоторые проверки типов параметров можно задать непосредственно в описании функции. Предыдущий пример на PHP5 будет выглядеть следующим образом: function showControl(HTMLControl $control) { ... } AssertsВо время создания и отладки программы можно использовать встроенный механизм добавления проверок в код программы. Он называется asserts (или assert-проверки). Идея его состоит в том, что в код программы добавляются специальные проверочные конструкции, которые можно отключить для production сайта, но в любой момент включить при разработке. Следующие фрагменты кода примерно аналогичны: /* Использование Asserts */ assert_options (ASSERT_ACTIVE, 1); function showControl(&$control) { assert('is_a($var, \'HTMLControl\') || $var == null'); ... } /* Использование if конструкций */ define('ASSERT_ACTIVE', 1); function showControl(&$control) { if (ASSERT_ACTIVE && !(is_a($var, 'HTMLControl') || $var == null')) trigger_error('Assertion failed', E_USER_ERROR); ... } С помощью таких проверок также можно проверять параметры функций, возвращаемые функциями значения и т.д. Нужно лишь учесть, что assert-проверки не должны быть включены в реально действующем сайте - если программа нормально работает и проходит все проверки, то их можно отключить. Проверять значения параметров скрипта $_REQUEST, $_GET, $_POST, $_COOKIESPHP скрипт можно рассматривать как большую функцию, которая вызывается с неопределенным списком string параметров. Если предполагается, что некоторые параметры будут использоваться в некоторых вычислениях, или отправляться в базу данных, то их обязательно надо преобразовывать к требуемому типу и использовать только после явного приведения! Все массивы Например: if (isset($_GET['id'])) $_GET['id'] = (int)$_GET['id']; else $_GET['id'] = null; Разделяй и властвуйИзвестный со времен древнего Рима принцип "Разделяй и властвуй" вполне может пригодится при разработке программ на любом языке программирования. В том числе и на PHP. Для реализации этого принципа разделяйте программу на логические блоки. Для этого можно воспользоваться следующими методами:
ЗаключениеВозможно, кому-то материал статьи покажется сбором прописных истин. Но я думаю, что большинству он все-таки пригодится, а для начинающих программистов последний раздел "Разделяй и властвуй" может оказаться особенно полезным, поскольку задает направление изучения программирования. Если у Вас есть комментарии или собственные приемы работы, которые не упомянуты в этой статье, я буду рад услышать и обсудить их с Вами. Также хочу выразить признательность участникам клуба phpclub.ru за помощь в написании статьи. История изменений2004-04-06: Исправлена ошибка в примере кода для раздела "Проверять значения параметров скрипта ...". 2004-03-22: Небольшие изменения разделов "Если вдруг сообщит", "Asserts". 2004-03-06: Добавлены ссылки на PHP документацию. Добавлена информация о
|
Форум Программиста
Новости Обзоры Магазин Программиста Каталог ссылок Поиск Добавить файл Обратная связь Рейтинги
|