it-roy-ru.com

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

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

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

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

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

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

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

А также:

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

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

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


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

591
mario

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

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

Function definition syntax abstract

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

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

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

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

    Expected: semicolon

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    • Что иногда является проблемой для пользователей 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.

268
mario

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

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

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

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

  1. NetBeans [бесплатно]
  2. PHPStorm [199 долларов США]
  3. Eclipse с PHP Plugin [бесплатно]
  4. Sublime [$ 80 USD] (в основном текстовый редактор, но расширяемый с помощью плагинов, например синтаксический анализатор PHP )
106
Sliq

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

В наши дни неожиданная скобка массива [ обычно встречается в устаревших 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 для сопоставления скобок, чтобы найти преждевременное закрытие массива ]. По крайней мере, используйте больше пробелов и новых строк, чтобы сузить его.

55
mario

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

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

purposefully abstract/inexact operator+$variable diagram

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

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

46
mario

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

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

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

32
mario

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

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

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

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

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

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

    • Для удобства вы должны предпочесть внешние одинарные кавычки при выводе простого 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\\".

23
mario

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

Открывающие скобки обычно следуют языковым конструкциям, таким как 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{]} !";
    

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


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

При получении "неожиданной ошибки }" вы в основном закрывали блок кода слишком рано.

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

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

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

    function whatever() {
        doStuff()
    }            ⇧
    

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

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

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

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

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

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


Неожиданный {, ожидаемый (

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

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

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

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

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

      ⇓
    if {
    }
    

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

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

16
mario

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

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

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

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

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

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

    • NetBeans, PhpStorm, Komodo: Ctrl[ а также Ctrl]
    • Затмение, Аптана: CtrlShiftP
    • Атом, возвышенное: Ctrlm - Zend Studio CtrlM
    • Geany, Блокнот ++: CtrlB - Джо: CtrlG - Emacs: C-M-n - Vim: %

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

Bracket matching in an 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; например.

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

14
mario

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

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

enter image description here

  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.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Если в Если

    Вы не можете вкладывать ifname __ в условие либо:

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

    Что, очевидно, является излишним, потому что and(или orname__) уже позволяет создавать цепочки сравнений.

  3. Забыт ; точка с запятой

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

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

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

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

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

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

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

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

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

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

    Где ; после блока кода {…} завершает всю конструкцию ifname__, синтаксически разделяя ветвь elsename__.

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

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

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

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

    Но для фактического использования блоков кода у вас есть для записи {} как таковых!

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

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

    Напоминаем себе, конечно, условный порядок .

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

    Вы можете иметь столько elseifname__s, сколько захотите, но elseдолжно идти последним . Вот только как это.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Не существует синтаксическая связь между ifи elsename__. Лексическая область действия foreachоканчивается на }, поэтому нет смысла продолжать структуру ifname__.

  9. T_ENDIF

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

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

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

    • Использование } endif; является удвоенным ifname __- терминатором.

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

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

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

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

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

13
mario

Неожиданный 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. Но даже тогда это не рекомендуется).

11
mario

Неожиданный 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(); ?>
               ↑
    

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

10
mario

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

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

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

Неожиданный '?', Ожидающий переменную

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

function add(?int $sum): ?int {

Что снова указывает на использование устаревшей версии PHP (либо версия CLI php -v, либо веб-сервер, связанный с одной phpinfo();).

6
John Conde

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

Маркер T_LNUMBER ссылается на "длинный"/номер.

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

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

    $1   // Bad
    $_1  // Good
    

    *

    • Довольно часто подходит для использования preg_replace- заполнителей "$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() {
    

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

5
John Conde

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

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

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

2
John Conde

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

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

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

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

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

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

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

1
John Conde

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

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

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

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

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

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

0
mplungjan