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

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

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

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

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

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

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

А также:

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

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

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


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

23 ответа

Решение

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Если ничего не помогает, вы всегда можете погуглить ваше сообщение об ошибке. Синтаксические символы не так легко найти (хотя переполнение стека индексируется 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.

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

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

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

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

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

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

В наши дни неожиданное [ скобка массива обычно встречается в устаревших версиях 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,


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

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

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

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

    $var = 2];
    

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

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

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

Неожиданный 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, если ваш код визуально не содержит проблему синтаксиса.

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

Неожиданный 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 жалуется на два строковых литерала, непосредственно следующих друг за другом. Но настоящая причина, конечно, в незакрытой предыдущей строке.

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

Неожиданный 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. Избежавшие кавычки

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

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

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

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

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

Открывающие скобки обычно следуют языковым конструкциям, таким как 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() являются встроенными языками, а не функциями. Им нужно получить доступ к переменной напрямую. Если вы ненароком добавите пару скобок слишком много, вы создадите выражение:

              ⇓
    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, так далее.

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

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

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

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

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

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

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

    • NetBeans, PhpStorm, Komodo: Ctrl[ и Ctrl]
    • Затмение, Аптана: CtrlShiftP
    • Атом, возвышенное: Ctrlm - Zend Studio CtrlM
    • Geany, Блокнот ++: CtrlB - Джо: CtrlG - Emacs: CMn - 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 и редакторы с подсветкой синтаксиса сделают это очевидным или предупредят об этом.

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

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

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

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

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

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

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

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

Неожиданный T_IF
Неожиданный T_ELSEIF
Неожиданный T_ELSE
Неожиданный T_ENDIF

Блоки условного контроля if, elseif а также else следовать простой структуре. Когда вы сталкиваетесь с синтаксической ошибкой, это, скорее всего, просто неправильное вложение блоков → с отсутствующим { Фигурные скобки } - или слишком много.

  1. Отсутствует { или же } из-за неправильного отступа

    Несоответствующие кодовые скобки являются общими для менее хорошо отформатированного кода, такого как:

    if((!($opt["uniQartz5.8"]!=$this->check58)) or (empty($_POST['poree']))) {if
    ($true) {echo"halp";} elseif((!$z)or%b){excSmthng(False,5.8)}elseif (False){
    

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

    Вы сможете исправить это только в том случае, если сможете визуально следовать вложенной структуре и соотношению условных операторов if/else и их { кодовые блоки }, Используйте IDE, чтобы увидеть, все ли они спарены.

    if (true) {
         if (false) {
                  …
         }
         elseif ($whatever) {
             if ($something2) {
                 …
             } 
             else {
                 …
             }
         }
         else {
             …
         }
         if (false) {    //   a second `if` tree
             …
         }
         else {
             …
         }
    }
    elseif (false) {
        …
    }
    

    Любой двойной }} закроет не только ветку, но и предыдущую структуру условий. Поэтому придерживайтесь одного стиля кодирования; не смешивать и сочетать во вложенных деревьях if/else.

    Помимо последовательности здесь оказывается полезным избегать и длительных условий. Используйте временные переменные или функции, чтобы избежать нечитаемости if -expressions.

  2. IF нельзя использовать в выражениях

    Удивительно частая ошибка новичка - попытка использовать if оператор в выражении, таком как оператор печати:

                       ⇓
    echo "<a href='" . if ($link == "example.org") { echo …
    

    Что, конечно, неверно.

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

    echo "<a href='" . ($link ? "http://yes" : "http://no") . "</a>";
    

    В противном случае разбейте такие выходные структуры: используйте несколько if с и echoс.
    А еще лучше, используйте временные переменные и поместите ваши условия перед:

    if ($link) { $href = "yes"; } else { $href = "no"; }
    echo "<a href='$href'>Link</a>";
    

    Определение функций или методов для таких случаев также часто имеет смысл.

    Блоки управления не возвращают "результаты"

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

    $var = if ($x == $y) { "true" };
    

    Что структурно идентично использованию if в конкатенации строк / выражении.

    • Но управляющие структуры (если / foreach / while) не имеют "результата".
    • Литеральная строка "true" также будет просто пустым утверждением.

    Вам придется использовать назначение в блоке кода:

    if ($x == $y) { $var = "true"; }
    

    Кроме того, прибегнуть к ?: троичное сравнение.

    Если в Если

    Вы не можете вкладывать if в условиях либо:

                        ⇓
    if ($x == true and (if $y != false)) { ... }
    

    Что явно избыточно, потому что and (или же or) уже позволяет сравнивать цепочки.

  3. Forgotton ; точка с запятой

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

                    ⇓
    $var = 1 + 2 + 3
    if (true) { … }
    

    Кстати, последняя строка в {…} Блок кода тоже нуждается в точке с запятой.

  4. Точка с запятой слишком рано

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

                ⇓
    if ($x == 5);
    {
        $y = 7;
    }
    else           ←
    {
        $x = -1;    
    }
    

    Что происходит чаще, чем вы можете себе представить.

    • Когда вы прекращаете if () выражение с ; он выполнит пустой оператор. ; становится пустым {} своего собственного!
    • {…} блок, таким образом, отделен от if и всегда будет бежать.
    • Итак else больше не имел отношения к открытому if конструкция, поэтому это может привести к непредвиденной синтаксической ошибке T_ELSE.

    Что также объясняет также тонкую вариацию этой синтаксической ошибки:

    if ($x) { x_is_true(); }; else { something_else(); };
    

    Где ; после блока кода {…} завершает весь if построить, разрывая else ветвь синтаксически.

  5. Не используя блоки кода

    Синтаксически разрешено пропускать фигурные скобки {... } для блоков кода в if / elseif / else ветви. К сожалению, это синтаксический стиль, очень распространенный для неверсированных кодеров. (Под ложным предположением это было быстрее напечатать или прочитать).

    Однако это, скорее всего, нарушит синтаксис. Рано или поздно дополнительные операторы найдут свой путь в ветки if/else:

    if (true)
        $x = 5;
    elseif (false)
        $x = 6;
        $y = 7;     ←
    else
        $z = 0;
    

    Но чтобы на самом деле использовать блоки кода, вы должны написать {... } их как таковых!

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

  6. Остальное / Elseif в неправильном порядке

    Конечно, нужно напомнить себе об условном заказе.

    if ($a) { … }
    else { … }
    elseif ($b) { … }
    ↑
    

    Вы можете иметь как можно больше elseif S, как вы хотите, но else должен идти последним. Вот только как это.

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

    Как упоминалось выше, вы не можете иметь управляющие операторы в объявлении класса:

    class xyz {
        if (true) {
            function ($var) {}
        }
    

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

  8. Неожиданный T_ELSEIF / T_ELSE

    При смешивании PHP и HTML закрытие } для if/elseif должен быть в том же блоке PHP <?php ?> как следующий elseif/else, Это приведет к ошибке при закрытии } для if должен быть частью elseif:

    <?php if ($x) { ?>
        html
    <?php } ?>
    <?php elseif ($y) { ?>
        html
    <?php } ?>
    

    Правильная форма <?php } elseif:

    <?php if ($x) { ?>
        html
    <?php } elseif ($y) { ?>
        html
    <?php } ?>
    

    Это более или менее вариант неправильного отступа - предположительно часто основанный на неправильных намерениях кодирования.
    Вы не можете смешивать другие заявления между if а также elseif / else структурные токены:

    if (true) {
    }
    echo "in between";    ←
    elseif (false) {
    }
    ?> text <?php      ←
    else {
    }
    

    Либо может произойти только в {…} кодовые блоки, не находящиеся между токенами структуры управления.

    • В любом случае это не имеет смысла. Это не так, что было некоторое неопределенное состояние, когда PHP перемещается между if а также else ветви.
    • Вы должны будете решить, где операторы печати принадлежат / или если они должны повторяться в обеих ветвях.

    Вы также не можете разделить if/else между различными структурами управления:

    foreach ($array as $i) {
        if ($i) { … }
    }
    else { … }
    

    Там нет синтаксической связи между if а также else, foreach лексическая сфера заканчивается } так что нет смысла if структура для продолжения.

  9. T_ENDIF

    Если на неожиданный T_ENDIF жалуются, вы используете альтернативный стиль синтаксиса if:elseif:else:endif;, О чем стоит подумать дважды.

    • Общая ловушка сбивает с толку : двоеточие для ; точка с запятой. (В "Точка с запятой слишком рано")

    • Поскольку отступы в файлах шаблонов отслеживать сложнее, тем более при использовании альтернативного синтаксиса - вероятнее всего endif; не соответствует ни одному if:,

    • С помощью } endif; это в два раза if -terminator.

    В то время как "неожиданный конец $" - это обычно цена за забытое закрытие } изогнутая скобка.

  10. Назначение против сравнения

    Итак, это не синтаксическая ошибка, но стоит упомянуть в этом контексте:

           ⇓
    if ($x = true) { }
    else { do_false(); }
    

    Это не == / === сравнение, но = назначение. Это довольно тонко, и некоторые пользователи легко могут бесполезно редактировать целые блоки условий. Сначала следите за непреднамеренными заданиями - всякий раз, когда вы испытываете логическую ошибку / неправильное поведение.

Неожиданный T_IF
Неожиданный T_FOREACH
Неожиданный T_FOR
Неожиданный T_WHILE
Неожиданный T_DO
Неожиданный T_ECHO

Управляющие конструкции, такие как if, foreach, for, while, list, global, return, do, print, echo может использоваться только как заявления. Они обычно проживают на линии самостоятельно.

  1. Точка с запятой; где ты?

    Довольно часто вы пропустили точку с запятой в предыдущей строке, если парсер жалуется на оператор управления:

                 ⇓
    $x = myfunc()
    if (true) {
    

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

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

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

    class xyz {
        if (true) {}
        foreach ($var) {}
    

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

  3. Заявления в контексте выражения

    Большинство языковых конструкций можно использовать только как операторы. Они не предназначены для размещения внутри других выражений:

                       ⇓
    $var = array(1, 2, foreach($else as $_), 5, 6);
    

    Точно так же вы не можете использовать if в строках, математических выражениях или где-либо еще:

                   ⇓
    print "Oh, " . if (true) { "you!" } . " won't work";
    // Use a ternary condition here instead, when versed enough.
    

    Для встраивания if как условия в выражении, вы часто хотите использовать ?: троичная оценка.

    То же самое относится и к for, while, global, echo и в меньшей степени list,

              ⇓
    echo 123, echo 567, "huh?";
    

    В то время как print() это встроенный язык, который может использоваться в контексте выражения. (Но редко имеет смысл.)

  4. Зарезервированные ключевые слова в качестве идентификаторов

    Вы также не можете использовать do или же if и другие языковые конструкции для пользовательских функций или имен классов. (Возможно, в PHP7. Но даже тогда это не рекомендуется).

Неожиданный T_IS_EQUAL
Неожиданный T_IS_GREATER_OR_EQUAL
Неожиданный T_IS_IDENTICAL
Неожиданный T_IS_NOT_EQUAL
Неожиданный T_IS_NOT_IDENTICAL
Неожиданный T_IS_SMALLER_OR_EQUAL
непредвиденный <
непредвиденный >

Операторы сравнения, такие как ==, >=, ===, !=, <>, !== а также <= или же < а также > в основном следует использовать только в выражениях, таких как if выражения. Если синтаксический анализатор жалуется на них, то это часто означает неправильный анализ или несоответствие () Парень вокруг них.

  1. Паренс группировка

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

                            ⇓
    if (($foo < 7) && $bar) > 5 || $baz < 9) { ... }
                          ↑
    

    Здесь if состояние здесь уже было прекращено )

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

  2. isset () пюре со сравнением

    Обычный новичок - Питфал пытается объединить isset() или же empty() со сравнениями:

                            ⇓
    if (empty($_POST["var"] == 1)) {
    

    Или даже:

                        ⇓
    if (isset($variable !== "value")) {
    

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

  3. Смешение >= больше или равно => оператор массива

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

             ⇓
    if ($var => 5) { ... }
    

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

    Смотрите также: Если структура оператора в PHP

  4. Нечего сравнивать

    Вы также не можете объединить два сравнения, если они имеют одно и то же имя переменной:

                     ⇓
    if ($xyz > 5 and < 100)
    

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

    Смотрите также: неожиданный T_IS_SMALLER_OR_EQUAL

  5. Цепочки сравнения

    Вы не можете сравнить с переменной с рядом операторов:

                      ⇓
     $reult = (5 < $x < 10);
    

    Это должно быть разбито на два сравнения, каждое против $x,

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

  6. непредвиденный >
    непредвиденный <

    Больше чем > или меньше чем < у операторов нет кастома T_XXX имя токенизатора. И хотя они могут быть неуместны, как и все остальные, вы все чаще видите, как парсер жалуется на них из-за неверно цитируемых строк и затертого HTML:

                            ⇓
    print "<a href='z">Hello</a>";
                     ↑
    

    Это составляет строку "<a href='z" сравнивать > в буквальную константу Hello а потом еще < сравнение. Или, по крайней мере, так видит PHP. Фактическая причина и синтаксическая ошибка была преждевременной строкой " прекращение.

    Также невозможно вложить стартовые теги PHP:

    <?php echo <?php my_func(); ?>
               ↑
    

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

Неожиданный '?'

Если вы пытаетесь использовать оператор объединения нулей ?? в версии PHP до PHP 7 вы получите эту ошибку.

<?= $a ?? 2; // works in PHP 7+
<?= (!empty($a)) ? $a : 2; // All versions of PHP

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

Знак T_LNUMBER относится к "длинному" / числу.

  1. Неверные имена переменных

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

    $1   // Bad
    $_1  // Good
    

    • Довольно часто подходит для использования preg_replace -placeholders "$1" в контексте PHP:

      #                         ↓            ⇓  ↓
      preg_replace("/#(\w+)/e",  strtopupper($1) )
      

      Где обратный звонок должен был быть процитирован. (Теперь /e Флаг регулярных выражений устарел. Но иногда это все еще неправильно используется в preg_replace_callback функции.)

    • То же ограничение идентификатора применяется к свойствам объекта, кстати.

             ↓
      $json->0->value
      
    • Пока токенизатор / парсер не допускает литерала $1 в качестве имени переменной можно использовать ${1} или же ${"1"}, Это синтаксический обход нестандартных идентификаторов. (Лучше всего думать об этом как о поиске локальной области видимости. Но в целом: для таких случаев предпочитайте простые массивы!)

    • Забавно, но очень не рекомендуется, парсер PHP позволяет использовать Unicode-идентификаторы; такой, что $➊ будет действительным. (В отличие от буквального 1).

  2. Запись массива

    Неожиданное длинное также может произойти для объявлений массива - при отсутствии , запятые:

    #            ↓ ↓
    $xy = array(1 2 3);
    

    Или аналогично вызовам и объявлениям функций и другим конструкциям:

    • func(1, 2 3);
    • function xy($z 2);
    • for ($i=2 3<$z)

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

  3. Неверно цитируемый HTML

    И опять же, неверно цитируемые строки являются частым источником случайных чисел:

    #                 ↓ ↓          
    echo "<td colspan="3">something bad</td>";
    

    Такие случаи должны рассматриваться более или менее как непредвиденные ошибки T_STRING.

  4. Другие идентификаторы

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

             ↓
    function 123shop() {
    

    Почти так же, как и для имен переменных.

Неожиданный '='

Это может быть вызвано наличием недопустимых символов в имени переменной. Имена переменных должны соответствовать следующим правилам:

Имена переменных следуют тем же правилам, что и другие метки в PHP. Допустимое имя переменной начинается с буквы или подчеркивания, за которым следует любое количество букв, цифр или подчеркивания. Как регулярное выражение, оно будет выражаться так: '[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*'

Неожиданный "."

Это может произойти, если вы пытаетесь использовать оператор splat (...) в неподдерживаемой версии PHP.

... впервые стал доступен в PHP 5.6 для захвата переменного числа аргументов функции:

function concatenate($transform, ...$strings) {
    $string = '';
    foreach($strings as $piece) {
        $string .= $piece;
    }
    return($transform($string));
}

echo concatenate("strtoupper", "I'd ", "like ", 4 + 2, " apples");
// This would print:
// I'D LIKE 6 APPLES

В PHP 7.4 вы могли использовать его для выражений массива.

$parts = ['apple', 'pear'];
$fruits = ['banana', 'orange', ...$parts, 'watermelon'];
// ['banana', 'orange', 'apple', 'pear', 'watermelon'];

неожиданный ':', ожидание ',' или ')'

При попытке использовать новую функциональность именованных параметров PHP 8 в версии PHP <8 возникнет эта ошибка:

      $table->string(column:'Name');

Решения:

  1. Обновите свою версию PHP до PHP 8.8.0 или выше
  2. Не используйте именованные параметры (передавайте параметры в ожидаемом порядке)

Неожиданный "конец" (T_ENDWHILE)

Синтаксис использует двоеточие - если двоеточие отсутствует, возникнет указанная выше ошибка

<?php while($query->fetch()): ?>
 .... 
<?php endwhile; ?>

Альтернативой этому синтаксису является использование фигурных скобок

<?php while($query->fetch()) { ?>
  ....
<?php } ?>

http://php.net/manual/en/control-structures.while.php

Неожиданное продолжение (T_CONTINUE)

continue является утверждением (например, for или if) и должно отображаться отдельно. Его нельзя использовать как часть выражения. Частично потому, что continue не возвращает значение, но в выражении каждое подвыражение должно приводить к некоторому значению, поэтому общее выражение приводит к значению. В этом разница между утверждением и выражением.

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

Неожиданный перерыв (T_BREAK)

То же самое касается break; конечно. Это также не для использования в контексте выражения, но строгое утверждение (на том же уровне, что и foreach или if блок).

Неожиданный возврат (T_RETURN)

Теперь это может быть более удивительным для return, но это также просто оператор уровня блока. Он возвращает значение (или NULL) в более высокую область видимости / функцию, но не оценивает само выражение. → То есть: нет смысла делать return(return(false);;

Еще одна причина возникновения этих ошибок - неожиданные пробелы, такие как аналогичные символы во встроенном коде, строки кода кажутся идеальными, но они содержат некоторые конкретные символы, которые похожи на строку разрыва, пробел или табуляцию, но они не анализируются парсер. Я сталкиваюсь с этой проблемой, когда пытаюсь поместить код с веб-страницы в редактор кода, просто скопировав вставку, я увидел эту ошибку с определением массива. все выглядело правильно в определении массива. Я не могу разобрать правильную ошибку, наконец, я определяю этот массив в одной строке, затем ошибка исчезла. затем снова я пытаюсь сделать это определение множественным, как, но вручную добавляя break (Enter) для каждого элемента массива и сохраняя файл, на этот раз без ошибок анализа редактором, а также без ошибок при его запуске. Например, я столкнулся с проблемой с этим фрагментом, который был в одном блоге, на самом деле может 't публиковать эти фрагменты, потому что переполнение стека уже знает проблему с кодом.

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

синтаксическая ошибка, непредвиденная ''auth'' (T_CONSTANT_ENCAPSED_STRING), ожидается ']'

          public $aliases = [
        'csrf'=> \CodeIgniter\Filters\CSRF::class,
        'toolbar'=> \CodeIgniter\Filters\DebugToolbar::class,
        'honeypot'=> \CodeIgniter\Filters\Honeypot::class,
        'auth' => \App\Filters\Auth::class,
];

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

Сообщение об ошибке, которое начинается Parse error: syntax error, unexpected ':' может быть вызвано ошибочной записью статической ссылки на класс Class::$Variable как Class:$Variable.

Что такое ошибка синтаксического анализа:

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

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

Пример из кода:

Выход:

Парсер отобразит сообщение об ошибке, подобное этому:

Ошибка синтаксического анализа: синтаксическая ошибка, неожиданный конец файла, ожидание переменной (T_VARIABLE) или ${ (T_DOLLAR_OPEN_CURLY_BRACES) или {$ (T_CURLY_OPEN) в /homepages/12/d1123465789/htdocs/index.php в строке 5

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

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

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

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

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

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

6- Невидимые случайные символы Unicode.

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

Запрос должен быть таким, используйте "{$}" чтобы ввести переменную, а "" важные.

      $sql "UPDATE parcels SET trucknum='{$truck}' WHERE ordernum='{$order}'";
Другие вопросы по тегам