парсинг — синтаксический анализ PHP / ошибки синтаксиса; и как их решить?

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

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

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

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

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

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

А также:

В то время как Stack Overflow также приветствует новичков, он в основном нацелен на вопросы профессионального программирования.

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

Если твой браузер отображает сообщения об ошибках, такие как «SyntaxError: недопустимый символ», тогда это на самом деле не -связанные, но ошибка синтаксиса.


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

555

Решение

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

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

Синтаксис определения функции абстрактный

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

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

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

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

    Ожидается: точка с запятой

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • Посмотрите на окраска синтаксиса!

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

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

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

    • Наличие двух одинаковых знаков препинания рядом друг с другом также может означать проблемы. Обычно операторы одиноки, если это не так ++, --или скобки после оператора. Две строки / идентификаторы, непосредственно следующие друг за другом, являются неверными в большинстве случаев.

  • Пробел твой друг.
    следить любой стиль кодирования.

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

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

    • Разделить комплекс if операторы в отдельные или вложенные if условия.

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

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

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

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

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

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

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

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

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

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

    • Троичный ? : оператор условия может компактировать код и действительно полезен. Но это не помогает удобочитаемости во всех случаях. Предпочитаю равнину if заявления пока не пересказаны.

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

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

    • Недостающие точки с запятой ; для завершения операторов / строк.

    • Несоответствующие строковые кавычки для " или же ' и неохраняемые цитаты внутри.

    • Забытые операторы, в частности для строки . конкатенации.

    • несбалансированный ( скобки ), Подсчитайте их в сообщенной строке. Есть ли их равное количество?

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

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

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

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

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

    • Пытаться grep --color -P -n "\[\x80-\xFF\]" file.php в качестве первой меры, чтобы найти не-ASCII символы.

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

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

    • PHP просто чтит \ п переводы строки, а не Возврат каретки.

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

    • Это часто только появляется как проблема, когда однострочный // или же # комментарии используются. Многострочный /*...*/ комментарии редко мешают анализатору, когда переводы строк игнорируются.

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

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

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

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

    • php -v для интерпретатора командной строки

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

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

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

  • Метод проб и ошибок — ваше последнее средство.

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

Дальнейшие руководства:

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

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

  • error_reporting = E_ALL
  • display_errors = 1

В вашем php.ini как правило, или через .htaccess для mod_php,
или даже .user.ini с настройками FastCGI.

Включение этого в сломанном скрипте слишком поздно, потому что PHP не может даже интерпретировать / запустить первую строку. Быстрый обходной путь — создание сценария оболочки, скажем test.php:

<?php
error_reporting(E_ALL);
ini_set("display_errors", 1);
include("./broken-script.php");

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

Это также помогает включить PHP error_log и посмотри в свой Веб-сервер-х error.log когда происходит сбой скрипта с ответами HTTP 500.

248

Другие решения

Я думаю, что эта тема полностью переоценена / слишком сложна. Использование IDE — это ПУТЬ, чтобы полностью избежать любых синтаксических ошибок. Я бы даже сказал, что работать без IDE — это непрофессионально. Зачем? Потому что современные IDE проверяют ваш синтаксис после каждого введенного вами символа. Когда вы кодируете, и вся ваша строка становится красной, а большое предупреждающее сообщение показывает точный тип и точное положение синтаксической ошибки, тогда совершенно не нужно искать другое решение.

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

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

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

  1. NetBeans [свободно]
  2. PhpStorm [$ 199 USD]
  3. Затмение с PHP Плагин [свободно]
  4. возвышенный [$ 80 USD] (в основном текстовый редактор, но расширяемый с помощью плагинов, например Синтаксический анализатор PHP)
98

непредвиденный [

В наши дни неожиданное [ скобка массива обычно встречается в устаревших версиях PHP. синтаксис короткого массива доступен с PHP > = 5,4. Более старые установки поддерживают только array(),

$php53 = array(1, 2, 3);
$php54 = [1, 2, 3];
⇑

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

$result = get_whatever()["key"];
⇑

Справка — Что означает эта ошибка в PHP? — «Синтаксическая ошибка, неожиданно \[« Показаны наиболее распространенные и практические обходные пути.

Тем не менее, вам всегда лучше просто обновить установку PHP. Для общих планов веб-хостинга, сначала исследуйте, например, если SetHandler php56-fcgi может использоваться для включения более новой среды выполнения.

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

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

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

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

  • Вы не можете использовать объявления / выражения свойств массива в классах, даже в PHP 7.

    protected $var["x"] = "Nope";
    ⇑
    
  • Смешение [ с открывающимися фигурными скобками { или скобки ( это общий недосмотр.

    foreach [$a as $b)
    ⇑
    

    Или даже:

    function foobar[$a, $b, $c] {
    ⇑
    
  • Или пытаться разыменовать константы (до PHP 5.6) как массивы:

    $var = const[123];
    ⇑
    

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

    Если вы хотели получить доступ к переменной массива (что является типичной причиной здесь), то добавьте ведущую $ сигил — так он становится $varname,

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

    global $var['key'];
    

непредвиденный ] закрытие квадратная скобка

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

  • Опять не соответствует ) скобки или } фигурные скобки распространены:

    function foobar($a, $b, $c] {
    ⇑
    
  • Или пытаться завершить массив, где его нет:

    $var = 2];
    

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

    $array = [1,[2,3],4,[5,6[7,[8],[9,10]],11],12]],15];
    ⇑
    

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

50

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

Неожиданный T_VARIABLE«означает, что есть буквальное $variable имя, которое не вписывается в текущую структуру выражения / оператора.

целенаправленно абстрактный / неточный оператор + $ переменная диаграмма

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

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

           ⇓
    func1()
    $var = 1 + 2;     # parse error in line +2
    
  2. Конкатенация строк

    Частые неудачи конкатенации строк с забытым . оператор:

                                   ⇓
    print "Here comes the value: "  $value;
    

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

    Строковая интерполяция является скриптовый язык Основная особенность. Не стыдно его использовать. Не обращайте внимания на любые советы по оптимизации . конкатенация Быстрее. Это не.

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

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

               ⇓
    print 4 + 7 $var;
    

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

  4. Списки

    То же самое для списков синтаксиса, как в массивах, где анализатор также указывает ожидаемую запятую , например:

                                          ⇓
    $var = array("1" => $val, $val2, $val3 $val4);
    

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

                                    ⇓
    function myfunc($param1, $param2 $param3, $param4)
    

    Эквивалентно ли вы видите это с list или же global заявления, или когда не хватает ; точка с запятой в for петля.

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

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

    class xyz {      ⇓
    var $value = $_GET["input"];
    

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

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

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

                 ⇓
    $this->myFunc$VAR();
    

    Кстати, это распространенный пример, где намерение было использовать переменные переменные возможно. В этом случае поиск свойства переменной с $this->{"myFunc$VAR"}(); например.

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

  7. Недостающие символы после языковых конструкций

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

           ⇓
    foreach $array as $key) {
    

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

  8. Остальное не ожидает условий

         ⇓
    else ($var >= 0)
    

    Решение: Удалить условия из else или использовать elseif.

  9. Нужны скобки для закрытия

         ⇓
    function() uses $var {}
    

    Решение: добавьте скобки вокруг $var,

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

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

    <?php
    ⇐
    $var = new PDO(...);
    

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

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

42

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

Громоздкие имена T_CONSTANT_ENCAPSED_STRING а также T_ENCAPSED_AND_WHITESPACE обратитесь к цитируемому "string" литералы.

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

  1. Неверная интерполяция переменных

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

                              ⇓     ⇓
    echo "Here comes a $wrong['array'] access";
    

    Заключение в кавычки массивов ключей является обязательным в контексте PHP. Но в двойных кавычках (или HEREDOC) это ошибка. Парсер жалуется на содержащийся одиночный цитируемый 'string'потому что обычно он ожидает буквальный идентификатор / ключ.

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

    echo "This is only $valid[here] ...";
    

    Однако для вложенных массивов или более глубоких ссылок на объекты требуется сложное вьющееся строковое выражение синтаксис:

    echo "Use {$array['as_usual']} with curly syntax.";
    

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

  2. Отсутствует сцепление

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

                           ⇓
    print "Hello " . WORLD  " !";
    

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

  3. Смешение строк в кавычках

    Такая же синтаксическая ошибка возникает, когда смешивающие разделители строк. Строка начинается с одного ' или двойной " цитата также заканчивается тем же.

                    ⇓
    print "<a href="' . $link . '">click here</a>";
    ⌞⎽⎽⎽⎽⎽⎽⎽⎽⌟⌞⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⌟⌞⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⌟
    

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

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

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

    print "<a href=\"{$link}\">click here</a>";
    

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

  4. Отсутствует вводная цитата

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

                   ⇓
    make_url(login', 'open');
    

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

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

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

    array(               ⇓
    "key" => "value""next" => "....",
    );
    

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

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

    То же самое для вызовов функций:

                             ⇓
    myfunc(123, "text", "and"  "more")
    
  7. Беглые строки

    Распространенным вариантом являются просто забытые терминаторы строк:

                                    ⇓
    mysql_evil("SELECT * FROM stuffs);
    print "'ok'";
    ⇑
    

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

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

31

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

T_STRING это немного неправильно. Это не относится к цитируемым "string", Это означает, что был обнаружен необработанный идентификатор. Это может варьироваться от bare слова до конца CONSTANT или имена функций, забытые строки без кавычек или любой простой текст.

  1. Ошибочные строки

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

                   ⇓                  ⇓
    echo "<a href="http://example.com">click here</a>";
    

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

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

    Смотрите также В чем разница между одинарными и двойными кавычками в PHP?.

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

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

                                                           ⇓
    echo "Some text", $a_variable, "and some runaway string ;
    success("finished");
    ⇯
    

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

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

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

    $text = ’Something something..’ + ”these ain't quotes”;
    

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

  4. Пропущенная точка с запятой; снова

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

           ⇓
    func1()
    function2();
    

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

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

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

          ⇓
    <?xml version="1.0"?>
    

    PHP увидит <? и вернуть его себе. Не поймет, что такое xml был предназначен для. Это будет интерпретировано как константа. Но version будет рассматриваться как другой литерал / константа. А так как синтаксический анализатор не может иметь смысла двух последующих литералов / значений без оператора выражения между ними, это будет ошибкой синтаксического анализатора.

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

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

    <?php
    print 123;
    

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

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

    <?php
    ;print 123;
    

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

  7. Знак `$` отсутствует перед именами переменных

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

    Знак доллара ($) это сигила который помечает идентификатор как имя переменной. Без этого знака идентификатор мог бы быть ключевое слово языка или постоянная.

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

  8. Избежавшие кавычки

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

    Пример: echo 'Jim said \'Hello\''; распечатает Jim said 'hello'

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

    Очень распространенная ошибка при указании путей в Windows: "C:\xampp\htdocs\" неправильно. Тебе нужно "C:\\xampp\\htdocs\\",

22

непредвиденный (

Открывающие скобки обычно следуют языковым конструкциям, таким как if/foreach/for/array/list или начать арифметическое выражение. Они синтаксически неверны после "strings"предыдущий (), в одиночестве $и в некоторых типичных контекстах объявления.

  1. Параметры объявления функции

    Более редкое возникновение этой ошибки пытаясь использовать выражения в качестве параметров функции по умолчанию. Это не поддерживается даже в PHP7:

    function header_fallback($value, $expires = time() + 90000) {
    

    Параметры в объявлении функции могут быть только литеральными значениями или константными выражениями. В отличие от вызовов функций, где вы можете свободно использовать whatever(1+something()*2) и т.п.

  2. Свойства класса по умолчанию

    То же самое для объявления членов класса, где допускаются только буквальные / постоянные значения, а не выражения:

    class xyz {                   ⇓
    var $default = get_config("xyz_default");
    

    Поместите такие вещи в конструктор.
    Смотрите также Почему атрибуты PHP не позволяют функции?

    Еще раз обратите внимание, что PHP 7 позволяет только var $xy = 1 + 2 +3; постоянные выражения там.

  3. Синтаксис JavaScript в PHP

    Используя JavaScript или Синтаксис JQuery не будет работать в PHP по понятным причинам:

    <?php      ⇓
    print $(document).text();
    

    Когда это происходит, это обычно указывает на неопределенную предшествующую строку; и буквальный <script> разделы просочились в контекст кода PHP.

  4. isset (()), пустой, ключ, следующий, текущий

    И то и другое isset() а также empty() являются встроенными языками, а не функциями. Oни нужен прямой доступ к переменной. Если вы ненароком добавите пару скобок слишком много, вы создадите выражение:

              ⇓
    if (isset(($_GET["id"]))) {
    

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

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

непредвиденный )

  1. Отсутствующий параметр функции

    Вы не можете заблудиться последние запятые в вызове функции. PHP ожидает значение там и поэтому жалуется на раннее закрытие ) скобка.

                  ⇓
    callfunc(1, 2, );
    

    Завершающая запятая допускается только в array() или же list() строит.

  2. Незаконченные выражения

    Если вы что-то забудете в арифметическом выражении, то парсер сдастся. Потому что как это должно интерпретировать это:

                   ⇓
    $var = 2 * (1 + );
    

    И если вы забыли закрытие ) даже тогда вы получите жалобу на неожиданную точку с запятой.

  3. Foreach как constant

    За забытая переменная $ префиксы в управляющих операторах ты увидишь:

                       ↓    ⇓
    foreach ($array as wrong) {
    

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

непредвиденный {

Фигурные скобки { а также } заключить блоки кода И синтаксические ошибки о них обычно указывают на некоторое неправильное вложение.

  1. Непревзойденные подвыражения в if

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

                                  ⇓
    if (($x == $y) && (2 == true) {
    

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

  2. {и} в контексте выражения

    Вы не можете использовать фигурные скобки в выражениях. Если вы перепутаете скобки и фигурные скобки, это не будет соответствовать грамматике языка:

               ⇓
    $var = 5 * {7 + $x};
    

    Есть несколько исключений для построения идентификатора, таких как локальная переменная области видимости ${references},

  3. Переменные переменные или выражения curly var

    Это довольно редко. Но вы также можете получить { а также } жалобы парсера на сложные переменные выражения:

                          ⇓
    print "Hello {$world[2{]} !";
    

    Хотя есть более высокая вероятность неожиданного } в таких контекстах.

непредвиденный }

При получении «неожиданного }msgstr «ошибка, вы в основном закрыли блок кода слишком рано.

  1. Последнее утверждение в блоке кода

    Это может произойти для любого неопределенного выражения.

    И если в последней строке в блоке функции / кода отсутствует трейлинг ; точка с запятой:

    function whatever() {
    doStuff()
    }            ⇧
    

    Здесь парсер не может сказать, если вы, возможно, еще хотите добавить + 25; к результату функции или что-то еще.

  2. Неправильное вложение блоков / Забыли {

    Иногда вы увидите эту ошибку синтаксического анализатора, когда блок кода был } закрыто слишком рано, или вы забыли открытие { четное:

    function doStuff() {
    if (true)    ⇦
    print "yes";
    }
    }   ⇧
    

    В приведенном фрагменте if не было открытия { изогнутая скобка. Таким образом, закрытие } один ниже стал излишним. И поэтому следующее закрытие }, который был предназначен для функции, не был связан с первоначальным открытием { изогнутая скобка.

    Такие ошибки еще сложнее найти без правильного отступа кода. Используйте IDE и сопоставление скобок.

непредвиденный {ожидая (

Языковые конструкции, которые требуют заголовка условия / объявления а также блок кода вызовет эту ошибку.

  1. Списки параметров

    Например ошибочно объявленные функции без списка параметров не допускаются:

                     ⇓
    function whatever {
    }
    
  2. Условия контрольной выписки

    И вы не можете также иметь if без условий.

      ⇓
    if {
    }
    

    Что не имеет смысла, очевидно. То же самое для обычных подозреваемых, for/foreach, while/do, так далее.

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

15

Неожиданный конец $

Когда PHP говорит о «неожиданном $end«, это означает, что ваш код закончился преждевременно. (Сообщение немного вводит в заблуждение, если воспринимать его буквально. Это не о переменной с именем» $ end «, как иногда предполагают новички. Это относится к» концу файла «, EOF.)

Причина: несбалансированный { а также } для блоков кода / и объявлений функций или классов.

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

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

  • Используйте IDE с сопоставлением скобок, чтобы узнать, где } Это неправильно.
    В большинстве IDE и текстовых редакторах есть сочетания клавиш:

    • NetBeans, PhpStorm, Komodo: Ctrl[ а также Ctrl]
    • Затмение, Аптана: Ctrlсдвигп
    • Атом, возвышенное: Ctrlм — Zend Studio CtrlM
    • Geany, Блокнот ++: CtrlВ — Джо: Ctrlг — Emacs: С-М-н — Vim: %

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

Соответствие скобок в IDE

Неопределенные выражения

А также Unexpected $end ошибка синтаксиса / синтаксического анализатора также может возникать для неопределенных выражений или операторов:

  • $var = func(1,
    ?>EOF

Итак, сначала посмотрите на конец скриптов. Трейлинг ; часто избыточен для последнего оператора в любом скрипте PHP. Но ты должен Имеется. Именно потому, что он сужает такие проблемы синтаксиса.

Отступы маркеры HEREDOC

Другое распространенное явление появляется с HEREDOC или NOWDOC строки. Завершающий маркер игнорируется начальными пробелами, символами табуляции и т. Д .:

print <<< END
Content...
Content....
END;
# ↑ terminator isn't exactly at the line start

Поэтому синтаксический анализатор предполагает, что строка HEREDOC будет продолжаться до конца файла (следовательно, «Неожиданный $ end»). Практически все IDE и редакторы с подсветкой синтаксиса сделают это очевидным или предупредят об этом.

Избежавшие кавычки

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

Пример: echo 'Jim said \'Hello\''; распечатает Jim said 'hello'

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

Очень распространенная ошибка при указании путей в Windows: "C:\xampp\htdocs\" неправильно. Тебе нужно "C:\\xampp\\htdocs\\",

Альтернативный синтаксис

Несколько реже можно увидеть эту синтаксическую ошибку при использовании альтернативного синтаксиса для блоков операторов / кода в шаблонах. С помощью if: а также else: и пропавший endif; например.

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

14
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector