Синтаксические ошибки в коде программы

Содержание

Часть 3 – Отладка программы

В предыдущей части мы рассмотрели исходный код и его составляющие.

После того, как вы начнете проверять фрагменты кода или попытаетесь решить связанные с ним проблемы, вы очень скоро поймете, что существуют моменты, когда программа крашится, прерывается и прекращает работу.

Отладка программы

Это часто вызвано ошибками, известными как дефекты или исключительные ситуации во время выполнения. Акт обнаружения и удаления ошибок из нашего кода – это отладка программы. Вы лучше разберетесь в отладке на практике, используя ее как можно чаще. Мы не только отлаживаем собственный код, но и порой дебажим написанное другими программистами.

Для начала необходимо рассортировать общие ошибки, которые могут возникнуть в исходном коде.

отладка программы

Синтаксические ошибки

Эти эрроры не позволяют скомпилировать исходный код на компилируемых языках программирования. Они обнаруживаются во время компиляции или интерпретации исходного кода. Они также могут быть легко обнаружены статическими анализаторами (линтами). Подробнее о линтах мы узнаем немного позже.

Синтаксические ошибки в основном вызваны нарушением ожидаемой формы или структуры языка, на котором пишется программа. Как пример, это может быть отсутствующая закрывающая скобка в уравнении.

Семантические ошибки

Отладка программы может потребоваться и по причине семантических ошибок, также известных как логические. Они являются наиболее сложными из всех, потому что не могут быть легко обнаружены. Признак того, что существует семантическая ошибка, – это когда программа запускается, отрабатывает, но не дает желаемого результата.

Рассмотрим данный пример:

По порядку приоритета, называемому старшинством операции, с учетом математических правил мы ожидаем, что сначала будет оценена часть умножения, и окончательный результат будет равен 33. Если программист хотел, чтобы сначала происходило добавление двух чисел, следовало поступить иначе. Для этого используются круглые скобки, которые отвечают за смещение приоритетов в математической формуле. Исправленный пример должен выглядеть так:

3 + 5, заключенные в скобки, дадут желаемый результат, а именно 48.

Ошибки в процессе выполнения

Как и семантические, ошибки во время выполнения никогда не обнаруживаются при компиляции. В отличие от семантических ошибок, эти прерывают программу и препятствуют ее дальнейшему выполнению. Они обычно вызваны неожиданным результатом некоторых вычислений в исходном коде.

Вот хороший пример:

Фрагмент кода выше будет скомпилирован успешно, но input 25 приведет к ZeroDivisionError. Это ошибка во время выполнения. Другим популярным примером является StackOverflowError или IndexOutofBoundError. Важно то, что вы идентифицируете эти ошибки и узнаете, как с ними бороться.

Существуют ошибки, связанные с тем, как ваш исходный код использует память и пространство на платформе или в среде, в которой он запущен. Они также являются ошибками во время выполнения. Такие ошибки, как OutOfMemoryErrorand и HeapError обычно вызваны тем, что ваш исходный код использует слишком много ресурсов. Хорошее знание алгоритмов поможет написать код, который лучше использует ресурсы. В этом и заключается отладка программы.

Процесс перезаписи кода для повышения производительности называется оптимизацией. Менее популярное наименование процесса – рефакторинг. Поскольку вы тратите больше времени на кодинг, то должны иметь это в виду.

Отладка программы

Вот несколько советов о том, как правильно выполнять отладку:

Двигаемся дальше

Поздравляем! Слово «ошибка» уже привычно для вас, равно как и «отладка программы». В качестве новичка вы можете изучать кодинг по книгам, онлайн-урокам или видео. И даже чужой код вам теперь не страшен :)

В процессе кодинга измените что-нибудь, чтобы понять, как он работает. Но будьте уверены в том, что сами написали.

Ошибки синтаксиса PHP/синтаксиса; и как их решить?

Все сталкиваются с синтаксическими ошибками. Даже опытные программисты делают опечатки. Для новичков это всего лишь часть учебного процесса. Однако часто легко интерпретировать сообщения об ошибках, такие как:

Ошибка синтаксического анализа PHP: синтаксическая ошибка, неожиданное ‘<' в index. php в строке 20

Неожиданный символ не всегда настоящий преступник. Но номер строки дает приблизительное представление о том, с чего начать.

Всегда смотрите на контекст кода. Синтаксическая ошибка часто скрывается в упомянутых или в предыдущих строках кода. Сравните ваш код с примерами синтаксиса из руководства.

Хотя не каждый случай соответствует другому. Тем не менее, есть некоторые общие шаги для решения синтаксических ошибок. Эти ссылки суммировали общие подводные камни:

Тесно связанные ссылки:

Хотя Qaru также приветствует начинающих программистов, он в основном нацелен на вопросы профессионального программирования.

    Отвечать на все ошибки в коде и узкие опечатки считается не по теме. Поэтому, пожалуйста, уделите время, чтобы выполнить основные шаги, прежде чем публиковать запросы на исправление синтаксиса. Если вам все еще нужно, пожалуйста, покажите свою собственную инициативу решения, предпринятые исправления и свой мыслительный процесс о том, что выглядит или может быть не так.

Синтаксические ошибки, возникающие в коде поставщика. Наконец, учтите, что если синтаксическая ошибка возникла не при редактировании базы кода, а после установки или обновления пакета внешнего поставщика, это может быть связано с несовместимостью версии PHP, поэтому проверьте требования поставщика к настройке платформы.,

Каковы синтаксические ошибки?

PHP относится к С-стилю и императивным языкам программирования. У него есть жесткие правила грамматики, которые он не может восстановить при обнаружении неулокальных символов или идентификаторов. Это не может угадать ваши намерения кодирования.

Самые важные советы

Есть несколько основных мер предосторожности, которые вы всегда можете предпринять:

Используйте правильные отступы кода или используйте любой высокий стиль кодирования. Читаемость предотвращает неровности.

Используйте IDE или редактор для PHP с подсветкой синтаксиса. Что также помогает с скобками/балансировкой скобок.

Expected: semicolon

Прочитайте справочник по языку и примеры в руководстве. Дважды, чтобы стать несколько опытным.

Как интерпретировать ошибки парсера

Типичное сообщение об ошибке синтаксиса гласит:

Ошибка разбора: синтаксическая ошибка, неожиданный T_STRING, ожидающий ‘ ; в file. php в строке 217

Который перечисляет возможное местоположение синтаксической ошибки. Смотрите упомянутое имя файла и номер строки.

Прозвище, такие как T_STRING объясняет, какой символ анализатор/токенизатор не удалось обработать, наконец. Однако это не обязательно является причиной синтаксической ошибки.

Решение синтаксических ошибок

Есть много подходов, чтобы сузить и исправить синтаксические ошибки.

Откройте указанный исходный файл. Посмотрите на упомянутую строку кода.

Для убегающих строк и неулокальных операторов, это обычно, где вы найдете виновника.

Прочитайте строку слева направо и представьте, что делает каждый символ.

Более регулярно вы должны смотреть и на предыдущие строки.

В частности, отсутствует ; точки с запятой отсутствуют в конце предыдущей строки/оператора. (По крайней мере, со стилистической точки зрения.)

Если < кодовые блоки >неправильно закрыты или вложены, вам может потребоваться еще больше изучить исходный код. Используйте правильный отступ кода, чтобы упростить это.

Строки, переменные и константы должны иметь разные цвета.

Операторы +-*/. также должен быть отчетливо окрашен. В противном случае они могут быть в неправильном контексте.

Если вы видите, что раскрашивание строк распространяется слишком далеко или слишком коротко, значит, вы обнаружили неэкранированный или отсутствующий закрывающий » или ‘ маркер строки.

Временно разбить длинные очереди.

Вы можете свободно добавлять символы новой строки между операторами или константами и строками. Затем синтаксический анализатор конкретизирует номер строки для анализа ошибок. Вместо того, чтобы смотреть на очень длинный код, вы можете изолировать отсутствующий или неулокальный синтаксический символ.

Вместо длинных математических формул или логических цепочек используйте временные переменные для упрощения кода. (Более читабельно = меньше ошибок.)

Добавьте новые строки между:

Код, который вы можете легко определить как правильный, Части, в которых вы не уверены, И строки, на которые парсер жалуется.

Разделение длинных блоков кода действительно помогает определить источник синтаксических ошибок.

Закомментируйте оскорбительный код.

Если вы не можете изолировать источник проблемы, начните закомментировать (и, следовательно, временно удалить) блоки кода.

Как только вы избавились от ошибки синтаксического анализа, вы нашли источник проблемы. Посмотри внимательнее там.

Иногда вы хотите временно удалить завершенные функциональные/методические блоки. (В случае непревзойденных фигурных скобок и ошибочно с отступом кода.)

Если вы не можете решить проблему с синтаксисом, попробуйте переписать закомментированные разделы с нуля.

Как новичок, избегайте некоторых запутанных синтаксических конструкций.

Альтернативный синтаксис PHP ( if: / elseif: / endif; ) является общим для шаблонов, но, возможно, менее прост для понимания, чем обычные блоки < code >.

Наиболее распространенные ошибки новичка:

Пропущенные точки с запятой ; для завершения операторов/строк.

Несоответствующие строковые кавычки для » или ‘ и неэкранированные кавычки внутри.

Не забывайте, что решение одной синтаксической проблемы может раскрыть следующую.

Если вы решите одну проблему, но в следующем коде появится другая, вы в основном на правильном пути.

Если после редактирования новой синтаксической ошибки появляется в той же строке, то ваша попытка изменения была неудачной. (Не всегда, хотя.)

Восстановите резервную копию ранее работающего кода, если вы не можете это исправить.

    Принять систему управления версиями исходного кода. Вы всегда можете посмотреть diff в сломанной и последней рабочей версии. Что может быть полезным для понимания проблемы синтаксиса.

Невидимые блуждающие символы Юникода: в некоторых случаях вам нужно использовать hexeditor или другой редактор/просмотрщик в вашем источнике. Некоторые проблемы не могут быть найдены только при просмотре вашего кода.

В частности, спецификации, пробелы нулевой ширины или неразрывные пробелы и регулярные умные кавычки могут найти свой путь в исходный код.

Позаботьтесь о том, какой тип переносов строк сохраняется в файлах.

PHP только чтит \n переводы строк, а не \r возврат каретки.

Что иногда является проблемой для пользователей MacOS (даже в OS X для неправильно настроенных редакторов).

Если ваша синтаксическая ошибка не передается через Интернет: бывает, что на вашем компьютере есть синтаксическая ошибка. Но размещение того же самого файла в Интернете больше не демонстрирует его. Что может означать только одну из двух вещей:

Вы смотрите не на тот файл!

Или ваш код содержал невидимый блуждающий Unicode (см. Выше). Вы можете легко узнать: просто скопируйте свой код обратно из веб-формы в текстовый редактор.

Проверьте свою версию PHP. Не все синтаксические конструкции доступны на каждом сервере.

<?php phpinfo(); за тот, который вызывается через веб-сервер.

Это не обязательно то же самое. В частности, при работе с фреймворками вы будете их сопоставлять.

Не используйте зарезервированные ключевые слова PHP в качестве идентификаторов для функций/методов, классов или констант.

Если ничего не помогает, вы всегда можете погуглить ваше сообщение об ошибке. Синтаксические символы не так легко найти (хотя переполнение стека индексируется SymbolHound). Поэтому может потребоваться просмотреть еще несколько страниц, прежде чем вы найдете что-то актуальное.

Белый экран смерти

Если ваш сайт просто пустой, то причиной обычно является синтаксическая ошибка. Включить их отображение с помощью:

Затем вызовите ошибочный код, обратившись к этому сценарию оболочки.

Это также помогает включить PHP error_log и заглянуть в ваш error. log веб-сервера, когда сценарий дает сбой с ответами HTTP 500.

Использование синтаксической проверки IDE означает:

Вы (эффективно) никогда не столкнетесь с синтаксическими ошибками снова, просто потому, что видите их правильно по мере ввода. Шутки в сторону.

Отличные IDE с проверкой синтаксиса (все они доступны для Linux, Windows и Mac):

NetBeans [бесплатно] PHPStorm [$ 199 USD] Eclipse с плагином PHP [бесплатно] Sublime [$ 80 USD] (в основном текстовый редактор, но расширяемый с помощью плагинов, таких как PHP Syntax Parser)

Неожиданный [

Разыменование результата функции массива также недоступно для более старых версий PHP:

Кстати, есть также препроцессоры и преобразователи синтаксиса PHP 5.4, если вы действительно цепляетесь за более старые + более медленные версии PHP.

Другие причины для неожиданного [ синтаксические ошибки

Если это не несоответствие версии PHP, то это часто простая синтаксическая ошибка или ошибка синтаксиса новичка:

Или пытаться разыменовать константы (до PHP 5.6) как массивы:

По крайней мере, PHP интерпретирует это const как постоянное имя.

Вы пытаетесь использовать ключевое слово global для члена ассоциативного массива. Это неверный синтаксис:

Неожиданно ] закрывающая квадратная скобка

Это несколько реже, но есть также синтаксические аварии с завершающим массивом ] скобка.

Опять несоответствие с ) круглые скобки или > фигурные скобки являются общими:

Или пытаться завершить массив, где его нет:

Что часто происходит в объявлениях многострочных и вложенных массивов.

Если да, то использовать IDE для согласования кронштейна, чтобы найти преждевременное ] закрытие массива. По крайней мере, используйте больше пробелов и новых строк, чтобы сузить его.

Неожиданный T_VARIABLE

Отсутствует точка с запятой

Это чаще всего указывает на отсутствующую точку с запятой в предыдущей строке. Переменные присваивания, следующие за выражением, являются хорошим показателем, на который следует обратить внимание:

Конкатенация строк

Кстати, вы должны предпочесть строчную интерполяцию (базовые переменные в двойных кавычках), когда это помогает читаемости. Это позволяет избежать этих синтаксических проблем.

Отсутствующие операторы выражения

Конечно, одна и та же проблема может возникнуть в других выражениях, например арифметических операций:

PHP не может угадать здесь, если переменная должна быть добавлена, вычтена или сравнена и т. д.

Списки

Или списки параметров функций:

Объявления классов

Эта ошибка парсера также встречается в объявлениях классов. Вы можете назначать только статические константы, а не выражения. Таким образом, парсер жалуется на переменные в качестве назначенных данных:

Непревзойденные > закрывающиеся фигурные скобки могут, в частности, привести сюда. Если метод заканчивается слишком рано (используйте правильный отступ!), Тогда блуждающая переменная обычно неправильно помещается в тело объявления класса.

Переменные после идентификаторов

Вы также можете никогда не иметь переменную, следуя за идентификатором напрямую:

Имейте в виду, что использование переменных переменных должно быть исключением. Новички часто пытаются использовать их слишком случайно, даже когда массивы будут проще и более уместны.

Отсутствие парсов после языковых конструкций

Скорейшее типирование может привести к забытой открывающей скобке для операторов if и for и foreach :

Решение: добавьте недостающее открытие ( между оператором и переменной.

Else не ожидает условий

Необходимые скобки для закрытия

Невидимые пробелы

Как упоминалось в справочном ответе «Невидимый бездомный Юникод» (например, неразрывное пространство), вы также можете увидеть эту ошибку для ничего не подозревающего кода:

Это довольно распространено в начале файлов и для копирования и вставки кода. Проверьте с помощью шестнадцатеричного кода, если ваш код визуально не содержит синтаксическую проблему.

Смотрите также

Неожиданное T_CONSTANT_ENCAPSED_STRING
Неожиданный T_ENCAPSED_AND_WHITESPACE

T_CONSTANT_ENCAPSED_STRING имена T_CONSTANT_ENCAPSED_STRING и T_ENCAPSED_AND_WHITESPACE относятся к цитированным «string» литералам.

Они используются в разных контекстах, но проблема синтаксиса весьма схожа. T_ENCAPSED. предупреждения встречаются в контексте с двойной кавычкой строки, в то время как T_CONSTANT. строки часто сбиваются с помощью простых выражений или утверждений PHP.

Неверная переменная интерполяция

И это чаще всего встречается при некорректной интерполяции переменных PHP:

Точнее, это справедливо для использования простого синтаксиса в стиле PHP2 в двойных кавычках для ссылок на массивы:

Вложенные массивы или более глубокие ссылки на объекты, однако, требуют синтаксиса сложного фигурного синтаксиса:

Если вы не уверены, это обычно безопаснее использовать. Он часто даже считается более читаемым. И лучшие IDE на самом деле используют для этого разную синтаксическую раскраску.

Отсутствует конкатенация

Если строка следует за выражением, но не имеет конкатенации или другого оператора, то вы увидите, что PHP жалуется на строковый литерал:

Хотя это очевидно для вас и меня, PHP просто не может догадаться, что строка должна быть добавлена туда.

Сбивающие с толку строковые кавычки

Такая же синтаксическая ошибка возникает при смешивании строковых разделителей. Строка запускается один ‘ или двойной » цитаты и заканчивается тем же.

Этот пример начинался с двойных кавычек. Но двойные кавычки также предназначались для атрибутов HTML. Предполагаемый оператор конкатенации внутри, однако, интерпретировался как часть второй строки в одинарных кавычках.

Совет. Установите редактор /IDE для использования слегка отличной раскраски для одиночных и двойных кавычек. (Это также помогает с логикой приложения, например, использовать двойные кавычки для текстового вывода и одиночные кавычки только для константоподобных значений.)

Это хороший пример, когда вы не должны выходить из двойных кавычек в первую очередь. Вместо этого просто используйте правильные \» для атрибутов HTML-атрибутов»:

Хотя это также может привести к путанице в синтаксисе, все лучшие IDE/редакторы снова помогают раскрасить экранированные кавычки по-разному.

Отсутствует стартовая цитата

Эквивалентно забытое открытие » / ‘ цитирует рецепт ошибок парсера:

Здесь ‘, ‘ станет строковым литералом после голого слова, когда, очевидно, login должен быть строковым параметром.

Списки массивов

Обратите внимание, что в последней строке всегда может содержаться дополнительная запятая, но игнорировать одно между ними непростительно. Это трудно обнаружить без подсветки синтаксиса.

Списки параметров функции

Беглые строки

Общим вариантом являются довольно просто забытые терминаторы строк:

Смотрите также

Неожиданный T_STRING

Неверные строки

Однако эта синтаксическая ошибка является наиболее распространенной для неверных строк. Любая неопределенная и бродячая » или ‘ цитата образует недопустимое выражение:

    Для удобства вы должны предпочесть внешние одинарные кавычки при выводе простого HTML с двойными кавычками внутри. Используйте двойные кавычки, если вы хотите интерполировать переменные, но затем следите за тем, чтобы избежать буквенных » двойных кавычек». Для более длинного выхода предпочитайте несколько строк echo / print вместо вылета и выхода. Еще лучше рассмотрим раздел HEREDOC.

Незакрытые строки

Если вы пропустите закрытие » тогда синтаксическая ошибка, как правило, будет реализована позже. Непривязанная строка будет часто потреблять бит кода до следующего предполагаемого значения строки:

Это не просто буквальный T_STRING который парсер может протестовать тогда. Еще одним частым изменением является Unexpected ‘>’ для некотируемого буквального HTML.

Непрограммируемые строковые кавычки

Если вы копируете и вставляете код из блога или веб-сайта, иногда вы получаете неверный код. Типографические котировки не соответствуют ожиданиям PHP:

Типографические/умные кавычки являются символами Юникода. PHP рассматривает их как часть смежного алфавитно-цифрового текста. Например, «these интерпретируются как константный идентификатор, но любой последующий текстовый литерал затем рассматривается как гонор /T_STRING парсером.

Отсутствует точка с запятой; еще раз

Если у вас есть неисчерпаемое выражение в предыдущих строках, любая следующая инструкция или языковая конструкция рассматривается как необработанный идентификатор:

PHP просто не может знать, хотите ли вы запустить две функции за другой, или если вы хотели бы умножить их результаты, добавить их, сравнить их или запустить только один || или другой.

Короткие открытые теги и заголовки <?xml в скриптах PHP

Это довольно редко. Но если short_open_tags включены, то вы не можете начинать свои PHP-скрипты с объявления XML:

Невидимые символы Юникода

Самой отвратительной причиной для синтаксических ошибок являются символы Юникода, такие как неразрывное пространство. PHP позволяет использовать символы Unicode в качестве имен идентификаторов. Если вы получаете жалобу на парсер T_STRING для совершенно невосприимчивого кода, например:

Вам нужно вырвать другой текстовый редактор. Или даже гекседектор. То, что выглядит как простые пространства и новые строки здесь, может содержать невидимые константы. Java-IDE иногда не обращают внимания на спецификацию UTF-8, искаженные внутри, пространства с нулевой шириной, разделители абзацев и т. д. Попытайтесь переиздать все, удалить пробелы и снова добавить обычные пробелы.

Вы можете сузить его, добавив избыточность ; разделители операторов при каждом запуске линии:

Дополнительный ; точка с запятой преобразует предыдущий невидимый символ в неопределенную константную ссылку (выражение как выражение). Это в свою очередь делает PHP полезным уведомлением.

Знак ‘$’ отсутствует перед именами переменных

Переменные в PHP представлены знаком доллара, за которым следует имя переменной.

Это обычная ошибка, когда код PHP был «переведен» из кода, написанного на другом языке (C, Java, JavaScript и т. д.). В таких случаях декларация типа переменной (когда исходный код был написан на языке, который использует типизированные переменные) также мог прокрасться и произвести эту ошибку.

Исключенные котировочные знаки

Если вы используете \ в строке, это имеет особое значение. Это называется » Escape Character » и обычно говорит парсеру буквально воспринимать следующий символ.

Пример: echo ‘Jim said \’Hello\»; будет печатать Jim said ‘hello’

Если вы избежите закрывающей цитаты строки, заключительная цитата будет взята буквально и не так, как предполагалось, то есть в качестве печатной цитаты как части строки, а не для закрытия строки. Это будет отображаться как ошибка разбора, обычно после открытия следующей строки или в конце скрипта.

Источники:

https://proglib. io/p/debugging/

https://progi. pro/oshibki-sintaksisa-phpsintaksisa-i-kak-ih-reshit-9509275

Понравилась статья? Поделиться с друзьями:
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: