Как бы тщательно мы ни были при написании программ, ошибки неизбежны. Эти ошибки обычно сбивают с толку компилятор PHP. Сообщения об ошибках компилятора не только бесполезны, но и часто разочаровывают, если разработчики не понимают, что они означают.
При компиляции PHP-скрипта компилятор PHP делает все возможное, чтобы сообщить о первой проблеме, с которой он сталкивается. Это создает проблему: PHP может распознать ошибку только тогда, когда она возникает (эта проблема подробно описана далее в этой статье). Именно по этой причине компилятор указывает, что строка с ошибкой может показаться на первый взгляд синтаксически правильной, или это может быть строка, которой вообще не существует!
Лучшее понимание сообщений об ошибках может значительно сократить время, затрачиваемое на выявление и исправление неисправности. Поэтому в этой статье я попытаюсь разъяснить множество различных типов сообщений об ошибках PHP и то, как правильно понимать значение различных сообщений об ошибках в процессе разработки.
Содержимое, описанное в этой статье, не имеет никакого отношения к используемой вами версии PHP, поскольку различные ошибки, описанные в этой статье, не ограничиваются конкретными ошибками в конкретной версии. Кроме того, мы предполагаем, что вы являетесь младшим или средним программистом и занимаетесь программированием полгода-год.
Как работает компилятор
Чтобы понять, почему компилятор сообщает об ошибке в определенной строке, вы должны сначала понять механизм, с помощью которого компилятор анализирует код PHP. Я не буду подробно останавливаться на этом в этой статье, но мы обсудим некоторые простые концепции, которые с большей вероятностью приведут к ошибкам.
Объявление переменной
Если вы объявляете переменную в операторе, конкретный метод выглядит следующим образом:
$variable = 'value'
Компилятор сначала находит значение правой половины оператора (то есть все, что находится в правой части равного значения); знак). В некоторых книгах по программированию это представлено как правая часть (правая половина) оператора. Именно эта часть утверждения часто вызывает ошибки. Если вы используете неправильный синтаксис, вы получите ошибку синтаксического анализа.
Ошибкаанализа
: ошибка анализа, неожиданный T_WHILE в c:\program files\apache group\apache\htdocs\script.php в строке 19.
Ошибки анализа появляются одна за другой каждый раз, когда определяется предыдущая ошибка. Продолжают появляться. Поскольку PHP прекращает выполнение сценария после первой ошибки синтаксического анализа, отладка и исправление этой серии ошибок часто может быть особенно утомительным.
Кроме того, ошибки синтаксического анализа содержат очень мало информации, при этом почти не сообщается номер строки, в которой произошла ошибка. Конкретная причина заключается в том, что при возникновении ошибки компилятор определяет, что синтаксис нескольких строк должен выглядеть корректным, пока не встретится недопустимый синтаксис. Наиболее вероятный случай - использование в выражении предопределенных слов, например
while = 10 ; / Bad ? while является предопределенным словом и не может быть присвоено значению.
К предопределенным словам относятся while, function и т. д. Если PHP использует использование для оценки вашего кода, вы не можете использовать эти предопределенные слова для именования переменных. в этом случае PHP будет сообщать о большем количестве ошибок, чего вы не сможете вынести.
Что касается этой проблемы, вам может помочь следующий пример. Пожалуйста, прочитайте код PHP, показанный ниже:
<?php
$b = некоторое значение
if($b == какое-то значение){
распечатать Привет, мир!;
}
?>
Ошибка находится в строке $b = (отсутствует точка с запятой в конце оператора), поэтому ошибка должна быть ошибкой синтаксического анализа: отсутствует точка с запятой в строке 3, верно? Он не должен определяться на основе парсера:
Ошибка синтаксического анализа: ошибка синтаксического анализа, неожиданный T_IF в c:\program files\apache
group\apache\htdocs\ereg2.php в строке 4.
В строке 4 синтаксис оператора if() правильный. Итак, что же сбивает с толку компилятор? Подсказка — неожиданная часть T_IF. Когда возникает непредвиденная ошибка T_???, это означает: компилятор обнаружил, что предопределенное слово появляется в позиции, где оно не должно появляться. T_IF представляет if(), T_WHILE представляет while(), T_FOR представляет for() и т. д.
К счастью, причина некоторых ошибок также проста:
оператор не завершается точкой с запятой (;), как в примере выше. В строке отсутствуют кавычки.
Некоторые другие распространенные ошибки
Самая распространенная ошибка, с которой я сталкиваюсь, — это не закрытие функции или цикла с помощью фигурной скобки ( }). Это, пожалуй, самая распространенная и досадная ошибка.
Конкретный код выглядит следующим образом:
function UselessFunction() {
for($i < 0; $i < 10; $i++){
}
Будет сгенерирована следующая ошибка:
Ошибка синтаксического анализа: ошибка синтаксического анализа, неожиданный $ в c:\program files\apache
group\apache\htdocs\ereg2.php в строке 9
Поскольку функция UselessFunction не заканчивается фигурной скобкой (}), компилятор PHP продолжает искать закрывающую скобку, пока не достигнет конца файла. Поскольку компилятор не находит соответствующую фигурную скобку, он сообщает об ошибке конца файла.
Если иерархия кода отражена правильно, сообщения об ошибках станут очень очевидными. Если не размечена иерархическая структура кода, то узнать, что же в итоге было забыто, будет практически невозможно. Итак, помните, обязательно указывайте иерархию вашего кода. Клавиша Tab упрощает это. Последующим разработчикам также будет легче понять структуру кода и изменить ее.
Ошибки MySQL
Еще одним чрезвычайно раздражающим сообщением об ошибке является наиболее распространенная ошибка MySQL, которая часто вызывает головную боль у новых пользователей PHP: Предупреждение: предоставленный аргумент не является допустимым ресурсом результата MySQL в...
Строка с ошибкой, описанной выше. Это может быть:
while ($row = mysql_fetch_array($result)) {
Параметр $result не является допустимым ресурсом. По-английски это означает, что mysql_fetch_array не может быть обработан, поскольку запрос не выполнен. Синтаксис любого запроса недействителен (необходимо скопировать и вставить запрос в ссылку на консоль MySQL для проверки), либо соединение с базой данных не удалось (в этом случае вам следует дважды проверить имя пользователя, пароль и т. д.).
Предотвращение ошибок
В качестве первого шага умные программисты могут предпринять следующие шаги для устранения следующих ошибок:
· Не думайте о добавлении точки с запятой в конце каждого оператора — это должно войти в привычку.
· Всегда указывайте иерархию вашего кода, когда это возможно. Это позволит вам увидеть, не забыли ли вы добавить фигурные скобки в таких местах, как вызовы или в конце функций.
· Используйте редактор с подсветкой синтаксиса (например, HTML-Kit). С помощью такого редактора вы сможете определить, не забыли ли вы поставить кавычку, не пропустили ли точку с запятой и т. д.
Заключение
В этой статье у нас есть определенное понимание некоторых, казалось бы, бессмысленных ошибок, о которых может сообщить компилятор PHP. Нам нужно применять то, чему мы научились, чтобы избежать ошибок и исправить их, когда они происходят. Отладка — одна из наиболее важных частей работы разработчика. Повышение эффективности отладки может значительно ускорить ход всей работы и сократить время, необходимое для завершения проекта. Это также может значительно снизить психологическое напряжение, вызванное сбоем кода.