Дебаг в PHP
Debug(de_bug) означает избавление от багов, то есть ошибок. В данной заметке я постараюсь изложить свой опыт ловли ошибок. Основные виды ошибок, с которыми придётся столкнуться: – Синтаксические – незакрытая скобка, пропущенная запятая. Код с такими ошибками просто не запустится, поэтому их обнаружение не составляет особого труда, да и PHP сам подсказывает где именно закралась ошибка. – Логические ошибки – неправильно написанное имя переменной, неправильное условие, вызов неправильной функции… Самый обширный вид и самый трудноулавливаемый, так как зачастую возникают только при одном типе структуры входных данных. На их исправлении и остановимся подробнее.
Для начала следует уяснить работу исполнителя кода. Код всегда исполняется сверху вниз. Первая строка будет исполнена раньше второй. Сейчас мы говорим строго о PHP, который не поддерживает многопоточность. Именно поэтому следует начинать поиски ошибки с первой строчки первого вызванного скрипта. Исполнитель также может “уходить” с какой-то строчки на другую или даже в другой файл, если вызвать функцию подключения или просто какую-либо функцию – исполнитель пойдёт выполнять код той функции. Поэтому, следует разбирать – куда же пошёл исполнитель, возможно в каком-то подключённом файле данные изменяются не так как хотелось бы. Чтобы отслеживать входные данные на протяжении всего исполнения скрипта, можно использовать функции var_dump и print_r, которые выводят на экран содержимое данных. Первая выводит ещё и тип, я рекомендую использовать её, т.к. иногда неверный тип имеет самое большое значение в возникновении ошибки.
Если мы дошли до строчки после которой данные отличаются от ожидаемых, следует выяснить почему же так произошло. Очень часто встречается неправильный вызов функции, изменяющей данные. Иногда функции могут принимать, помимо данных, ключи, указывающие как эти данные нужно обработать. Например, функция htmlspecialchars принимает 2 ключа – как обрабатывать кавычки и кодировку. Иногда, в новых версиях значения этих ключей могут принимать другой смысл и скрипт, написаный под одну версию, может некорректно работать в более новой. Также, иногда меняется само поведение функции. Обычно это всё изложено в мануале по функции. Если мы видим, что поведение функции ожидаемо, значит, вероятно, данные для функции передаются в неправильном формате. Например, функция ожидает целое число, а мы передаём ей строку и она пытается разделить строку на число. Зачастую PHP сам преобразовывает типы, но преобразование не всегда предсказуемо, поэтому в функцию данные лучше передавать в требуемом типе.
Самая ранняя стадия получения неверных данных – ввод пользователем неверного текста. Поэтому следует проверить эти данные в первую очередь. Достаточно просто поставить код вроде var_dump($_POST); в какое-либо место скрипта(естественно, вставить нужно синтаксически верно, а не в абы какое место) и на экран будет выведено содержимое массива данных POST в данном месте скрипта.
Для дебаггинга на стороне клиента очень хорошо подходит Firefox с установленным расширением FireBug. К слову, для этого расширения есть подрасширение – FirePHP, позволяющее дампить переменные не засоряя дизайн сайта(данные передаются в заголовках страницы).
В процессе поиска ошибки следует тщательно следить за изменением всех данных – от локальных переменных до глобальных массивов. Иногда причиной ошибки оказывается другая ошибка – незапланированное изменение какой-нибудь глобальной переменной.
Вообще же поиск ошибки это такое занятие, когда следует очень чётко представлять как те или иные входящие данные должны изменяться в процессе выполнения скрипта. И если они изменяются не так, как надо, то причины может быть 2 – либо ошибка языка программирования, либо ошибка программиста. Первое сейчас почти не встречается, второе – сплошь и рядом. Очень часто встречается непонимание принципа действия функции – от этого лечит прочтение мануала. Да и вообще стоит иногда почитывать эту полезную штуку – очень много подводных камней в приведении типов станут ясны.
Таким образом, заканчивая, можно обобщить мысли: ошибки бывают разные, бороться с ними тоже нужно по-разному, имея в арсенале разные инструменты, но в любом поиске главный – один: голова. Ошибки стоит искать от начала и до места выхода – ошибка не возникает в коде, который не исполняется. Также не стоит избегать мониторинга глобальных данных. А если ошибка всё же произошла – лучше показать пользователю какую-нибудь заранее заготовленную страницу, чем поехавшую куда-то мазню.
|
опубликовано: 2008-03-25 16:17