Для отладки необходимо хотя бы минимальное знание английского языка и умение пользоваться словарем. Сообщения об ошибках - всегда на английском. Не пытайтесь отгадывать или менять код методом тыка, в надежде, что он заработает. Прочитайте сообщение об ошибке, поймите его — это ключевое действие, на основе которого можно планировать дальнейшие шаги.
Error: Call to undefined function App\Users\undef() /usr/src/app/src/Users.php:9 /usr/src/app/tests/UsersTest.php:27
Отладка всегда сводится к двум вещам:
- перевести сообщение об ошибке
- найти в бектрейсе то место в своем коде, после которого произошла ошибка.
Вывод ошибок делится на две части: непосредственно сообщение с ошибкой и бектрейс.
Бектрейс (иногда говорят "стектрейс") - это список всех вызовов функций от запуска программы вплоть до того места, где произошла ошибка. Бектрейс - очень важный инструмент, который позволяет увидеть то, как выполнялась ваша программа, и какие функции вызывались.
Бектрейс
С бектрейсом всё просто - он собой указание на файл и строчку, в которой была вызвана соответствующая функция. Бектрейс называется back, потому, что вывод строк идет в обратном порядке. Наверху находится последний вызов, внизу - первый. В рамках одного бектрейса возможны (и часто встречаются) ситуации, когда часть функций вызывается где-то в библиотеках, которые вы не писали, но используете, а часть - в вашем коде.
Ошибки
Наиболее простые и понятные ошибки — синтаксические. Они связаны исключительно с тем, что код записан неверно, например забыта точка с запятой в конце инструкции. В выводе таких ошибок всегда присутствуют фразы parse error и syntax error. Для их исправления нужно открыть то место в коде, на которое указывает ошибка, и внимательно на него посмотреть.
PHP Parse error: syntax error, unexpected '}' in /usr/src/app/src/Users.php on line 7
Еще одна большая группа ошибок называется ошибками программирования. К ним, например, относятся:
- Вызов несуществующей функции
- Использование необъявленной переменной
- Передача неверных аргументов в функции, например, аргументов, имеющих неверный тип
Эти ошибки исправить труднее, чем синтаксические. Обычно они возникают в результате неправильной логики в другом, более раннем вызове.
Последняя разновидность — логические ошибки. Исправить такие ошибки бывает крайне сложно, так как программа продолжает работать, но выдает неверный результат. Причем обычно программа выдает неверный результат не всегда, а только лишь для некоторых входных данных. В подавляющем большинстве случаев проблема кроется в неверной логике, например, перепутана операция, и вместо сложения выполняется вычитание.
Типы ошибок
PHP, в силу исторических причин, имеет необычную, откровенно говоря, странную и все усложняющую систему ошибок. Если в других аналогичных языках, технически, ошибки делятся на два типа — ошибки парсинга и исключения, то в PHP к ним еще добавляются Notice, Warning и Fatal Error.
- PHP Notice — это даже не ошибка, а просто предупреждение о том, что код написан не очень хорошо,
но останавливать его выполнение никто не будет:
<?php $i += 3; // PHP Notice: Undefined variable: i in php shell code on line 1
- PHP Warning. Это тоже предупреждения, но, исходя из названия, более серьезные.
- Fatal Error — это уже настоящие ошибки, но они, в отличие от исключений, не могут быть обработаны и просто завершают выполнение программы.