Пишем PHP код, устойчивый к ошибкам |
||||
---|---|---|---|---|
Предисловие В этой статье я постараюсь собрать техники и приемы, позволяющие минимизировать количество ошибок в программе, написанной на PHP. Но некоторые из представленных методов могут пригодится если вы пишите на любом языке программирования. Знание - половина успеха В PHP контроль вывода сообщений транслятора определяется функцией error_reporting и значением директивы error_reporting в php.ini. Рекомендуемое её значение E_ALL - т.е. выводить сообщения о всех потенциально опасных ситуациях. К ним в PHP относятся, например, использование неинициализированной переменной, обращение к несуществующему элементу массива и т.д. Для включения максимально подробного вывода сообщений транслятора поставьте в начале программы вызов функции error_reporting: // Для PHP4 или поставьте значение error_reporting = E_ALL в php.ini. С более подробном описании возможных уровней reporting можно знакомится в PHP документации - Error Handling and Logging Functions. Для PHP5 введен уровень E_STRICT, который включает вывод сообщений о использовании в коде устаревших методов программирования (например, используется var для описания внутренних переменных класса). Он не входит в E_ALL, поэтому для PHP5 рекомендуемый уровень сообщений E_ALL | E_STRICT (т.е. E_ALL и E_STRICT). Соответственно, для задания вывода всех сообщений от транслятора надо вызвать error_reporting с таким параметром: // Для PHP5 Если ни о чем не сообщает if (ini_get('display_errors') != 1) { // проверяет значение опции
display_errors Если вдруг сообщит Полезно также поставить свой обработчик ошибок, если Вы хотите не только заносить ошибки в Log файл но и добавить некоторую дополнительную логику их обработки. Например, отправить письмо при сообщении транслятора или вывести некоторое специальное сообщение для пользователя. Подробнее об этом написано в статье Ловля ошибок в PHP, которую написал Антон Довгаль. Сравниваем константу с переменной, а не наоборот if (10 == $i) { В случае использования "=" вместо "==" транслятор выдаст ошибку "Parse error: parse error in ... on line ...". Таким образом ошибка обнаруживается значительно быстрее. Не используем значение дважды Для PHP4 существует единственный способ объявить константу - использовать функцию define. Например: define ('BEFORE_RENDER', 'beforeRender'); Констант в классах объявлять нельзя. Расширение PHP 5 для определения констант сходно с тем, которое было осуществлено при расширении от C до C++ - используется ключевое слово const. Но константы таким образом можно создавать только внутри классов. Например: class ControlEvents { Но для обращения к такой константе необходимо знать имя класса. Константы могут быть также добавлены непосредственно в класс. Но PHP не поддерживает такой метод. Поэтому придется объявить их как обычные переменные: class Control { Проверка параметров функции Для проверки типа используются следующие функции: gettype(Mixed $var) - возвращает тип переменной. Код функции, осуществляющей проверку аргументов, может быть примерно такой: /** Достоинство этого метода состоит в том, что можно управлять сообщениями об ошибках и использовать собственный обработчик ошибок. Например, Вы можете использовать следующие функции для проверки параметров: function checkParameter(&$var, $class) { Примечание: Функция debug_backtrace введена только в PHP 4.3.0. Пример их применения: function showControl(&$control) { Для PHP5 некоторые проверки типов параметров можно задать непосредственно в описании функции. Предыдущий пример на PHP5 будет выглядеть следующим образом: function showControl(HTMLControl $control) { Asserts Следующие фрагменты кода примерно аналогичны: /* Использование Asserts */ С помощью таких проверок также можно проверять параметры функций, возвращаемые функциями значения и т.д. Нужно лишь учесть, что assert-проверки не должны быть включены в реально действующем сайте - если программа нормально работает и проходит все проверки, то их можно отключить. Проверять значения параметров скрипта $_REQUEST, $_GET, $_POST,
$_COOKIES Все массивы REQUEST являются является обычными массивами, поэтому значения в них могут быть переопределены непосредственно. Например: if (isset($_GET['id'])) Разделяй и властвуй Использование функций. Использование классов. Разделяйте логику и HTML. Разделяйте логику самого приложения при помощи enterprise design
patterns. Заключение Если у Вас есть комментарии или собственные приемы работы, которые не упомянуты в этой статье, я буду рад услышать и обсудить их с Вами. Также хочу выразить признательность участникам клуба phpclub.ru за помощь в написании статьи. |